题目链接:点击查看

题目大意:求 ax+by+cz=K,K∈[1,h]ax+by+cz=K,K\in [1,h]ax+by+cz=K,K∈[1,h] 有多少个 KKK 满足方程

题目分析:设 d[i]d[i]d[i] 为固定 xxx 后能够到达 modx=i\mod x=imodx=i 的最小楼层,也就是仅通过操作 2,32,32,3 所能到达的最小楼层,转移方程为 d[i+y]=d[i]+yd[i+y]=d[i]+yd[i+y]=d[i]+y 和 d[i+z]=d[i]+zd[i+z]=d[i]+zd[i+z]=d[i]+z,此方程可以用迪杰斯特拉转移,计算出 ddd 数组后,答案就是 ∑(h−d[i]x+1)\sum (\frac{h-d[i]}{x}+1)∑(xh−d[i]​+1) 了,此处的 +1+1+1 意味着原本高度为 iii 的楼层

代码:

// Problem: P3403 跳楼机
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3403
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
template<typename T>
struct Dij
{const static int N=1e6+100;const static int M=1e6+100;struct Edge{int to,next;T w;}edge[M];int head[N],cnt;//链式前向星 T d[N];bool vis[N];void addedge(int u,int v,T w){edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;}struct Node{int to;T w;Node(int TO,T W){to=TO;w=W;}bool operator<(const Node& a)const{return w>a.w;}};void Dijkstra(int st){priority_queue<Node>q;memset(vis,false,sizeof(vis));memset(d,0x3f,sizeof(d));d[st]=1;q.push(Node(st,0));while(q.size()){Node cur=q.top();int u=cur.to;q.pop();if(vis[u])continue;vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next)//扫描出所有边 {int v=edge[i].to;T w=edge[i].w;if(d[v]>d[u]+w)//更新 {d[v]=d[u]+w;q.push(Node(v,d[v]));}}}}void init(){memset(head,-1,sizeof(head));cnt=0; }
};
Dij<LL>t;
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);t.init();LL h;int x,y,z;read(h),read(x),read(y),read(z);if(x==1||y==1||z==1) {cout<<h<<endl;return 0;}for(int i=0;i<x;i++) {t.addedge(i,(i+y)%x,y);t.addedge(i,(i+z)%x,z);}t.Dijkstra(1);LL ans=0;for(int i=0;i<x;i++) {if(t.d[i]>h) {continue;}ans+=(h-t.d[i])/x+1;}cout<<ans<<endl;return 0;
}

洛谷 - P3403 跳楼机(同余最短路)相关推荐

  1. P3403 跳楼机 同余最短路

    传送门 题意: 思路: 转换一下题目就是用若干x,y,zx,y,zx,y,z能凑出来多少个<=h<=h<=h的数.先考虑两个数y,zy,zy,z的情况,我们如果能求出来这两个数能凑出 ...

  2. 同余最短路(P3403 跳楼机)

    同余最短路 前置 给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法. P3403 跳楼机 ...

  3. 【洛谷 P3403】跳楼机(SPFA)

    P3403 跳楼机 题目背景 DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧. 题目描述 Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机, ...

  4. 最短路模型-跳楼机-洛谷P3403

    第一次遇到这种数学题转化为图论的题目,与我一开始的想法相同,将其中一个变量与另外两个变量分离开来,便于处理.由于以前一直认为SPFA会被卡,所以使用了堆优化的Dijkstra,结果超时了,为什么呢?因 ...

  5. 洛谷 P1082 同余方程(同余exgcd)

    嗯... 题目链接:https://www.luogu.org/problem/P1082 这道题很明显涉及到了同余和exgcd的问题,下面推导一下: 首先证明有解情况: ax + by = m有解的 ...

  6. 洛谷 - P4568 [JLOI2011]飞行路线(分层图最短路)

    题目链接:点击查看 题目大意:给出一张图,每条边都有权值,现在要求从点st到达点ed,沿途中可以让k条边的边权免费,现在求最短路 题目分析:分层图经典模板问题,直接套板子就行了,最后记得对于数组d的每 ...

  7. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

  8. 洛谷P1346-电车【日常图论,最短路,SPFA】

    题目 一个有向图,每个点有个默认方向和若干个其他方向,走默认方向权值为0,其他方向权值为1,求最短路 输入 3 2 1(3个点,点2到点1) 2 2 3(2个点,起点为1,2为默认点,3为其他点) 2 ...

  9. 洛谷P3371-【模板】单源最短路【SPFA】

    题目 一个有向图,求一点到所有点的最短距离 输入 4 6 1(4个点,6条边,从1出发) 1 2 2(1点到2点有一条权值2的线) 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 输出 0 ...

  10. 洛谷 P5663 [CSP-J2019] 加工零件(最短路)

    题目描述 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇.工厂里有 nn 位工人,工人们从 1 \sim n1∼n 编号.某些工人之间存在双向的零件传送带.保证每两名工人 ...

最新文章

  1. STM32开发 -- 启动流程
  2. 图像处理--线line 提取
  3. mysql产品优化方案_mysql的优化方案
  4. Javascript 时间操作汇总
  5. WEB API Filter的使用以及执行顺序
  6. C/C++调用java---JNI常用函数
  7. 局域网如何测试网速手机软件,如何轻松测试局域网网速
  8. 推荐一些socket工具,TCP、UDP调试、抓包工具
  9. web前端学习的职业发展方向
  10. 【地球科学】常用的地理投影坐标系介绍(笔记)
  11. do还是doing imagine加to_to-do和doing用法及区别
  12. 使用html和css的一些案列(小米官网)
  13. Java试用两个月,我快被劝退了
  14. 2023武汉集训总结
  15. 解决element-ui对话框组件el-dialog遮罩层小问题
  16. PW4056H充电芯片,1A可调充电
  17. 多点登陆限制,禁止用户多点在线
  18. 超详细IntelliJ IDEA安装教程
  19. 三天的时间,如何学会C++,原来只要四个步骤
  20. color属性 python_Python curses.COLOR_BLUE属性代码示例

热门文章

  1. openvswitch 实践一 创建patch port连接ovs两个桥
  2. excel中输入身份证号后三位变成0怎么办
  3. 基于51片机的电子密码锁设计
  4. 数据分析--企业的贤内助 附下载地址
  5. 基站位置查询系统_Android获取手机基站位置并进行基站定位的原理
  6. hdu 1880 魔咒字典
  7. c语言水仙花数pow,c语言如何解水仙花数
  8. 信息安全快讯丨一起为亚运健儿加油!
  9. win7无法连接打印机拒绝访问_win7系统共享打印机拒绝访问的完美解决方法
  10. python中多行语句可以使用反斜杠来实现吗_Python中的多行语句可以使用反斜杠来实现...