[bzoj2118]墨墨的等式
2016-02-26 08:09
274 查看
2118: 墨墨的等式
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 878 Solved: 337
[Submit][Status][Discuss]
Description
墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N、{an}、以及B的取值范围,求出有多少B可以使等式存在非负整数解。
Input
输入的第一行包含3个正整数,分别表示N、BMin、BMax分别表示数列的长度、B的下界、B的上界。输入的第二行包含N个整数,即数列{an}的值。
Output
输出一个整数,表示有多少b可以使等式存在非负整数解。
Sample Input
2 5 10
3 5
Sample Output
5
HINT
对于100%的数据,N≤12,0≤ai≤5*10^5,1≤BMin≤BMax≤10^12。
设最小的点是x,如果y能被凑出来,那么y+x就也能被凑出来。
这样把每个点模x之后,用模后的数在0~n-1的点上建图,这样跑出来从0到每个点的最短路的长度就是最初到达这个点需要的大小,然后再利用模的数算答案就行了。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define LL long long #define inf 0x7ffffffffffff const int N=500010; bool f ; struct S{int st,en;LL va;}aa[N*15]; int n,point ,next[N*15],tot,l ; LL bmin,bmax,a[20],dis ; inline void add(int x,int y,LL z){ tot+=1;next[tot]=point[x];point[x]=tot; aa[tot].st=x;aa[tot].en=y;aa[tot].va=z; } inline void SPFA(){ int h=0,t=1,u,i; for(i=0;i<=a[1];++i) dis[i]=inf,f[i]=1; l[h]=0;dis[0]=0; while(h!=t){ h=h%a[1]+1;u=l[h];f[u]=true; for(i=point[u];i;i=next[i]) if(dis[aa[i].en]>dis[u]+aa[i].va){ dis[aa[i].en]=dis[u]+aa[i].va; if(f[aa[i].en]){ f[aa[i].en]=false; t=t%a[1]+1; l[t]=aa[i].en; } } }dis[0]=a[1]; } int main(){ int i,j; scanf("%d%lld%lld",&n,&bmin,&bmax); for(i=1;i<=n;++i) scanf("%lld",&a[i]); sort(a+1,a+n+1); for(i=0;i<a[1];++i) for(j=1;j<=n;++j) add(i,(i+a[j])%a[1],a[j]); SPFA(); LL ans=0,x,y; for(i=0;i<a[1];++i) if(dis[i]<=bmax){ x=max(0LL,(bmin-dis[i])/a[1]); y=(bmax-dis[i])/a[1]; if(x*a[1]+dis[i]<bmin) x+=1; if(y*a[1]+dis[i]>bmax) y-=1; ans+=y-x+1; } printf("%lld\n",ans); }
相关文章推荐
- Andriod学习笔记5:通过NDK在C++中实现日志输出
- 前端开发环境搭建
- 学习Java的计算机基础普及
- 直接调用、间接调用和内联调用
- am,pm命令
- 自己动手写CPU之第五阶段(1)——流水线数据相关问题
- 设计模式之二十四:訪问者模式(Visitor)
- OSChina 周五乱弹 ——程序员的年龄天花板到底是多少岁?
- lintcode-easy-Majority Number
- 同一包(package)下,两个不同类的调用操作详解
- STM32CubeMX本地升级固件库方法
- Linux 内核, Android 开发, Android 安全 博客精选
- adb shell 基本命令
- ARM64的启动过程之(五):UEFI
- ARM64的启动过程之(四):打开MMU
- bzoj2815 灾难 拓扑排序&lca
- ARM64的启动过程之(三):为打开MMU而进行的CPU初始化
- java中的java.util.Map的实现类
- ARM64的启动过程之(二):创建启动阶段的页表
- ARM64的启动过程之(一):内核第一个脚印