LINK:跳楼机

很早之前就想学的一个东西。发现这个东西果然神奇。

我们要找到 所有的 w满足 \(w=1+ax+by+cz\).且 \(1\leq w\leq h\)

暴力枚举是不行的。

做法是这样的:先考虑 ax+by的情况 考虑先让x和y组合成一堆数字 然后最后加上一些z。

考虑对于一个楼层c 设res=c%z. 那么只要(ax+by)%z == res 找到这个最小的楼层那么之后所有 %z==res 的楼层都可以到达。

那么对于更多的ax+by的组合我们也只需要靠z到达即可。

考虑是否存在重复?不难发现因为同余的原因 每一个楼层最多只会在一个余数被计数。

考虑最小的楼层可以记录之后所有的楼层。

所以设\(f_i\)表示ax+by能跑到i层的最小楼层。

可以简单的发现 对于一个余数i来说 对答案的贡献为 \(\frac{(h-f_i)}{z}+1\)

其主要利用了固定两个参数 最后增加第三个参数 来计数。

可以证明 方案不重不漏.

  1. //#include<bits\stdc++.h>
  2. #include<iostream>
  3. #include<iomanip>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<string>
  7. #include<ctime>
  8. #include<cmath>
  9. #include<cctype>
  10. #include<cstdlib>
  11. #include<queue>
  12. #include<deque>
  13. #include<stack>
  14. #include<vector>
  15. #include<algorithm>
  16. #include<utility>
  17. #include<bitset>
  18. #include<set>
  19. #include<map>
  20. #define ll long long
  21. #define db double
  22. #define INF 1000000000
  23. #define inf 100000000000000000ll
  24. #define ldb long double
  25. #define pb push_back
  26. #define get(x) x=read()
  27. #define gt(x) scanf("%d",&x)
  28. #define put(x) printf("%d\n",x)
  29. #define putl(x) printf("%lld\n",x)
  30. #define gc(a) scanf("%s",a+1)
  31. #define rep(p,n,i) for(RE ll i=p;i<=n;++i)
  32. #define go(x) for(ll i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
  33. #define fep(n,p,i) for(RE ll i=n;i>=p;--i)
  34. #define pii pair<ll,ll>
  35. #define mk make_pair
  36. #define RE register
  37. #define S second
  38. #define gf(x) scanf("%lf",&x)
  39. #define pf(x) ((x)*(x))
  40. #define ull unsigned long long
  41. #define mod 1000000007
  42. #define ui unsigned
  43. #define P 13331ll
  44. using namespace std;
  45. char buf[1<<15],*fs,*ft;
  46. inline char getc()
  47. {
  48. return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
  49. }
  50. inline ll read()
  51. {
  52. register ll x=0,f=1;register char ch=getc();
  53. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
  54. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
  55. return x*f;
  56. }
  57. const ll MAXN=100010;
  58. ll n,ans,len;
  59. ll x,y,z;
  60. ll f[MAXN],vis[MAXN];
  61. ll lin[MAXN],ver[MAXN<<1],nex[MAXN<<1],e[MAXN<<1];
  62. priority_queue<pii>q;
  63. inline void add(ll x,ll y,ll z)
  64. {
  65. ver[++len]=y;
  66. nex[len]=lin[x];
  67. lin[x]=len;
  68. e[len]=z;
  69. }
  70. signed main()
  71. {
  72. //freopen("1.in","r",stdin);
  73. get(n);get(x);get(y);get(z);
  74. if(x==1||y==1||z==1){putl(n);return 0;}
  75. memset(f,-1,sizeof(f));
  76. f[1]=1;q.push(mk(1,1));
  77. rep(0,z-1,i)add(i,(i+y)%z,y),add(i,(i+x)%z,x);
  78. while(q.size())
  79. {
  80. ll x=q.top().S;q.pop();
  81. if(vis[x])continue;
  82. vis[x]=1;
  83. go(x)
  84. {
  85. if(f[tn]==-1||f[tn]>f[x]+e[i])
  86. {
  87. f[tn]=f[x]+e[i];
  88. q.push(mk(-f[tn],tn));
  89. }
  90. }
  91. }
  92. rep(0,z-1,i)if(f[i]!=-1&&n>=f[i])ans=(ans+(n-f[i])/z+1);
  93. putl(ans);return 0;
  94. }

luogu P3403 跳楼机 同余最短路的更多相关文章

  1. 【同余最短路】【例题集合】洛谷P3403 跳楼机/P2371 墨墨的等式

    接触到的新内容,[同余最短路]. 代码很好写,但思路不好理解. 同余最短路,并不是用同余来跑最短路,而是通过同余来构造某些状态,从而达到优化时间空间复杂度的目的.往往这些状态就是最短路中的点,可以类比 ...

  2. 洛谷P3403跳楼机(最短路构造/同余最短路)

    题目-> 解题思路: 最短路构造很神啊. 先用前两个值跑在第三个值模意义下的同余最短路(这步贪心可以证明,如果第三步长为z,那么如果n+z可以达到,n+2z同样可以达到) 最后计算与楼顶差多少个 ...

  3. [洛谷P3403] 跳楼机

    题目传送门 套路题,同余最短路. 先只考虑y.z进行连边,再在mod x的意义下进行计算. 这里的“距离”dis[i]指的是,在所有满足a mod x=i的a里,能到达的最小的a是多少. 显然只要能到 ...

  4. P3403 跳楼机

    题解: 据说是最短路经典题 考虑mod c一意义下 我们会发现mod c相同的话我们一定会用最少步数到达,剩余的都用c转移 由于转移图有环所以我们用spfa来dp(其实也可以理解成最短路) wa了好多 ...

  5. 【同余最短路】洛谷 P2662 牛场围栏

    关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...

  6. ACM-图论-同余最短路

    https://www.cnblogs.com/31415926535x/p/11692422.html 一种没见过的处理模型,,记录一下,,主要是用来处理一个多元一次方程的解的数量的问题,,数据量小 ...

  7. [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)

    题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...

  8. JZOJ 4722. 跳楼机

    Description  DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方 ...

  9. BZOJ2118: 墨墨的等式(最短路构造/同余最短路)

    Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...

随机推荐

  1. python爬京东(带GUI)

    最近写了个专门爬百度的,后来又想爬京东的,还是采用上次的BeautifulSoup+requests模块 下面直接上代码,看不懂的可以看这篇文章或者注释来学习 #!/usr/bin/env pytho ...

  2. 复杂链表的复制(剑指offer-25)

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点.(注意,输出结果中请不要返回 ...

  3. 记一次使用elasticsearch遇到bug的探索过程

    背景: 练习一个小项目,爬取京东的数据,存到ES库中,然后读取ES库中数据,展示到页面上.效果图如下: 涉及两个接口,一个爬取写入ES接口,一个查询展示接口,当我写完代码信心满满准备看看效果的时候,调 ...

  4. Linux常用命令-文件传输类

    bye 功能说明:中断FTP连线并结束程序 语 法:bye 补充说明:在FTP模式下,输入bye即可中断正在执行的连线作业,并且结束FTP的执行 ftp(file transfer protocol) ...

  5. Spring-boot 启动报错 调试小技巧

    描述: 我们在启动spring-boot,spring-cloud 项目时,是不是经常 遇到报错,但是在控制台 没有能找到 具体 报错信息,只是 提示,启动失败,缺乏具体的报错信息,这样就很不方便我们 ...

  6. MYSQL 之 JDBC(十): JDBC的元数据

    可以从Connection对象中获得有关数据库管理系统的各种信息 获取这些信息的方法都是在DatabaseMetaData类中. DatabaseMetaData:描述数据库的元数据对象 Result ...

  7. nginx配置文件服务器——带说明

    需求: 搭建一个文件服务器,提供指定软件下载,在访问文件服务器下载软件时,在访问的主页上要有对应的软件使用.安装等说明(本来是可以搞一个readme的,但这个在文件服务器上要下载还要打开,还不如直接显 ...

  8. [Qt2D绘图]-01Qt2D绘图基本绘制和填充

    Qt的文档位置为 Paint System   大纲:     简介     先看一个小例子     基本的绘制和填充         使用画笔(Qpen)         使用画刷(QBrush) ...

  9. Cyber Security - Palo Alto Basic Introduction

    Preparation of the Lab Environment: Download and Install Pan-OS from the following website https://d ...

  10. P4547 [THUWC2017]随机二分图(状压,期望DP)

    期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...