[Luogu3403]跳楼机

luogu

题意

其实就是给你三个数\(x,y,z\),问你能够凑出多少个\([1,h]\)之间的数。
\(1\le h \le 2^{63}-1\),\(1\le x,y,z \le 10^5\)

sol

用\(y,z\)凑出的在模\(x\)意义下相同的数一定是越小越好。
所以可以写一个最短路求出用\(y,z\)凑出的在模\(x\)意义下为\(i\)的最小的数,记为\(f_i\),那么模意义下为\(i\)的所有数的总贡献就是\[\lfloor\frac{h-f_i}{x}\rfloor+1\ \ \ \ (f_i\le h) \ \ \ \ or\ \ 0\ \ \ \ (f_i>h)\]

code

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
#define pli pair<ll,int>
#define mk make_pair
const int N = 1e5+5;
int x,y,z,to[N<<1],nxt[N<<1],ww[N<<1],head[N],cnt,vis[N];
ll h,f[N],ans;
priority_queue<pli,vector<pli>,greater<pli> >Q;
void link(int u,int v,int w)
{
    to[++cnt]=v;nxt[cnt]=head[u];ww[cnt]=w;
    head[u]=cnt;
}
void Dijkstra()
{
    memset(f,63,sizeof(f));
    f[1%x]=1;Q.push(mk(1,1%x));
    while (!Q.empty())
    {
        int u=Q.top().second;Q.pop();
        if (vis[u]) continue;vis[u]=1;
        for (int e=head[u];e;e=nxt[e])
            if (f[to[e]]>f[u]+ww[e])
                f[to[e]]=f[u]+ww[e],Q.push(mk(f[to[e]],to[e]));
    }
}
int main()
{
    scanf("%lld",&h);
    scanf("%d%d%d",&x,&y,&z);
    if (y<x) swap(x,y);if (z<x) swap(x,z);
    for (int i=0;i<x;++i) link(i,(i+y)%x,y),link(i,(i+z)%x,z);
    Dijkstra();
    for (int i=0;i<x;++i) if (f[i]<=h) ans+=(h-f[i])/x+1;
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/zhoushuyu/p/8711517.html

时间: 2024-07-28 15:22:58

[Luogu3403]跳楼机的相关文章

Luogu P3403 跳楼机|同余最短路

题意:给出跳楼机的4个操作,分别为 1.向上移动\(x\)层: 2.向上移动\(y\)层: 3.向上移动\(z\)层: 4.回到第一层. 显然,并不需要 求从第一层开始,能到达\(1\)到\(h\)中的多少层? \(1<=h<=2^{63}-1\) \(1<=x, y, z<=100000\) 题解: 好像可以直接\(DP\)? 布星啊,看下数据范围. 那先来推推定理? 接下来假设\(x\le y\le z\) 对于一个数\(k\),若它能到达,则\(k+x,k+2x,k+...\

[spfa] Jzoj P4722 跳楼机

Description DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方便的上楼.经过改造,srwudi的跳楼机可以采用以下四种方式移动:1.向上移动x层:2.向上移动y层:3.向上移动z层:4.回到第一层.一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层.DJL想知道,他可以乘坐跳楼机前往的楼层数. Input 第

JZOJ_4722. 跳楼机 (Standard IO)

Description  DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方便的上楼.经过改造,srwudi的跳楼机可以采用以下四种方式移动:1.向上移动x层:2.向上移动y层:3.向上移动z层:4.回到第一层.一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层.DJL想知道,他可以乘坐跳楼机前往的楼层数. Input

JZOJ #4722 跳楼机

题目描述: 给出h.x.y.z,求在h以内,x.y.z可以凑出多少个不同的数. (1≤h≤10^18,1≤x, y, z≤10^5.) 解题思路: 直接做显然不好做.我们考虑取n个y和m个z,然后再加上x.2 * x.3 * x...,显然地,只要对于每种取法,(ny + mz) % x 的值不同的话,就不会有重复.所以我们先求出 d[i] = c 表示通过选y和z使得和模x等于i的最小和c.然后答案就是 ∑0≤i<x (h - d[i]) / x + 1.至于怎么求d[i],可以发现 d[(i

【LGOJ3403】跳楼机

一栋楼共有 h 层,有以下操作: 1. 向上移动x层 2. 向上移动y层 3. 向上移动z层 4. 回到第一层 问可以达到的楼层数量 如果令\(f(i)\)表示表示仅通过操作2和操作3能到达的 \(mod\ x=i\) 的最小楼层 那么就有以下方程: \[f(i+y)=f(i)+y\] \[f(i+z)=f(i)+z\] 想一想最短路的转移方程 \[f(v)=f(u)+dis(u,v)\] 是不是很像? 所以我们可以建图,把 \(i+y\) 和 \(i+z\) 看作点 \(y,z\)成为权值,跑

旅游 - 珠海长隆海洋王国 - 鹦鹉过山车

说来惭愧,三十多岁的人从来没坐过过山车.以往没坐过不是因为胆小,只是没有机会,几年前有一次已经把车开到了欢乐谷门口,但硬是被无穷无尽的长队给吓退.难得这次有机会,就争取感受一把.早上进园的时候已经很晚,原本还担心要排很久的队伍,实际走到那个僻静的入口时并没有看到什么人.穿过长长长长的幽深小径之后来到上车点.前面只稀稀拉拉排了十几个人,等了一辆车就排到了.本来想坐第一排最外侧的位置,可惜放眼镜的时候被人抢坐,只能坐在第三排的外侧.耳边都是在说什么很害怕不想坐了,我也稍微有了一点紧张.坐上之后盖好固

《机电传动控制》第五周学习笔记

1. 我比较感兴趣的电机 我对电影放映机里面的电机比较感兴趣,虽然现在许多的许多电影放映机都是使用电子设备来完成胶片的推送,但一些电影院仍然在使用那种轮式的电影放映机,这种放映机是使用胶片的,这就要求里面电机的转速比较均匀,且每张胶片能够保持一秒内播放规定的帧数,一般是24帧或30帧.利用所学的知识,我推测里面用的应该是步进电机,每秒转24步或30步从而达到画面流畅的要求,这需要通过协调步距角和转速来实现.电机每走一步就播放一帧,这样电机的步距角同时还必须与胶片的尺寸大小.轮盘的直径相协调.同时

台湾自由行

背景: 趁老婆台湾出差机会,策划了此次台湾自由行,这样省掉了一个人机票钱^_^.老婆出差从3月8日-3月13日,然后就地请假一周加上前后周末大概10天,同时我13号从天津出发与她台湾会和. 前期准备工作: 大陆通行证和入台证 因为此计划2月初才定下来,只有1个多月的时间办理通行证和入台证.通行证去出入境管理局办理就行,大约需要1周的时间,主要入台证需要旅行社代办,通过淘宝办理的,加上赶上新年假期,3月初就办理完成了,速度还是很快的,费用大约每人200多吧. 台币,华夏银行卡 在中国银行预约大约6

HK游记 Day2迪斯尼(下)

接下来我们要去看狮子王庆典,绕啊绕啊,终于进场了,说实话我对一大帮人扮演动物歌舞表演不是很感冒,静倒是觉得很好看,印象最深的是狮子王的主题曲,还有大象车,长颈鹿车,狮子王车,静举着手机拍视频. 看完表演静发现手机好烫,而且充不进去电,静又生气了.坐了一会儿,我们去冒险世界的灰熊山谷,排队上了灰熊矿车,这个过山车有点刺激,在往最高点攀爬的过程中,突然失控,反方向掉下去了,山洞里有很多灰熊,突然灰熊发现我们了,灰熊一声嚎叫,山洞里咔嚓一道闪电,好可怕,我们的矿车飞速的奔驰,逃离灰熊山洞,终于结束了,