BZOJ2118 墨墨的等式

题链:http://www.lydsy.com/JudgeOnline/problem.php?id=2118

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*105,1≤BMin≤BMax≤1012

题解

假设x是一个可以被拼出的可行解,那么(x+k*a[i])必然也是可行解,那么我们把a[i]设为最小的a[0]即可,因为这样才能使得k最大。同时我们可以得到:

  1. x可以写成k*a[0]+i,(0<=i<a[0])
  2. 所以最多只有i个解,我们只需求出每个解的最小代价即可

    因此可以建图,每个i与(a[j]+i)%a[0],之间的代价为a[j],之后再求0到每个i之间的距离即可

参考代码

  1. #include <queue>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <vector>
  9. #define ll long long
  10. #define inf 10000000000000
  11. #define mod 1000000007
  12. using namespace std;
  13. ll read()
  14. {
  15. ll x=0,f=1;
  16. char ch=getchar();
  17. while(ch<'0'||ch>'9')
  18. {
  19. if(ch=='-')f=-1;
  20. ch=getchar();
  21. }
  22. while(ch>='0'&&ch<='9')
  23. {
  24. x=x*10+ch-'0';
  25. ch=getchar();
  26. }
  27. return x*f;
  28. }
  29. const int N=5e5+10;
  30. const int M=5e6+10;
  31. int cnt;
  32. struct Edge{
  33. int cost,to,nxt;
  34. Edge(){};
  35. Edge(int tc,int tt,int tn=0):cost(tc),to(tt),nxt(tn){}
  36. bool operator < (const Edge &an) const{
  37. return cost>an.cost;
  38. }
  39. }Path[M];
  40. int a[20],head[N];
  41. ll dis[N];
  42. bool vis[N];
  43. void Addedge(int u,int v,int w){
  44. Path[cnt]=(Edge){w,v,head[u]};
  45. head[u]=cnt++;
  46. }
  47. void Dijkstra()
  48. {
  49. priority_queue<Edge>que;
  50. for(int i=0;i<a[0];i++) dis[i]=inf;
  51. dis[0]=0;
  52. que.push(Edge(0,0));
  53. while(!que.empty()){
  54. int cur=que.top().to;que.pop();
  55. if(vis[cur])continue;
  56. vis[cur]=true;
  57. for(int i=head[cur];i;i=Path[i].nxt)
  58. if(dis[cur]+Path[i].cost<dis[Path[i].to]){
  59. dis[Path[i].to]=dis[cur]+Path[i].cost;
  60. que.push(Edge(dis[Path[i].to],Path[i].to));
  61. }
  62. }
  63. }
  64. ll query(ll x)
  65. {
  66. ll ans=0;
  67. for (int i=0;i<a[0];i++)
  68. if (dis[i]<=x) ans+=(x-dis[i])/a[0]+1;
  69. return ans;
  70. }
  71. void Init(){
  72. cnt=1;
  73. memset(head,0,sizeof(head));
  74. }
  75. int main(){
  76. int top=0,n=read();
  77. ll l=read(),r=read();
  78. Init();
  79. for(int i=0;i<n;i++){
  80. int x=read();
  81. if(x==0) continue;
  82. a[top++]=x;
  83. }
  84. sort(a,a+top);
  85. for(int i=0;i<a[0];i++){
  86. for(int j=1;j<top;j++){
  87. Addedge(i,(a[j]+i)%a[0],a[j]);
  88. }
  89. }
  90. Dijkstra();
  91. printf("%lld\n",query(r)-query(l-1));
  92. return 0;
  93. }

【BZOJ 2118】 墨墨的等式(Dijkstra)的更多相关文章

  1. 【BZOJ 2118】墨墨的等式

    http://www.lydsy.com/JudgeOnline/problem.php?id=2118 最短路就是为了找到最小的$x$满足$x=k×a_{min}+d,0≤d<a_{min}$ ...

  2. bzoj 2118 墨墨的等式 - 图论最短路建模

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

  3. 数论+spfa算法 bzoj 2118 墨墨的等式

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1283  Solved: 496 Description 墨墨突然对等式很感兴 ...

  4. 【BZOJ 2118】 2118: 墨墨的等式 (最短路)

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

  5. [图论训练]BZOJ 2118: 墨墨的等式 【最短路】

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

  6. bzoj 2118: 墨墨的等式

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

  7. bzoj 2118: 墨墨的等式 spfa

    题目: 墨墨突然对等式很感兴趣,他正在研究\(a_1x_1+a_2y_2+ ... +a_nx_n=B\)存在非负整数解的条件,他要求你编写一个程序,给定\(N,\{a_n\}\)以及\(B\)的取值 ...

  8. BZOJ2118墨墨的等式[数论 最短路建模]

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1317  Solved: 504[Submit][Status][Discus ...

  9. 【BZOJ2118】墨墨的等式(最短路)

    [BZOJ2118]墨墨的等式(最短路) 题面 BZOJ 洛谷 题解 和跳楼机那题是一样的. 只不过走的方式从\(3\)种变成了\(n\)种而已,其他的根本没有区别了. #include<ios ...

随机推荐

  1. 通过爬虫爬取四川省公共资源交易平台上最近的招标信息 --- URLConnection

    通过爬虫爬取公共资源交易平台(四川省)最近的招标信息 一:引入JSON的相关的依赖 <dependency>       <groupId>net.sf.json-lib< ...

  2. Poj 2594 Treasure Exploration (最小边覆盖+传递闭包)

    题目链接: Poj 2594 Treasure Exploration 题目描述: 在外星上有n个点需要机器人去探险,有m条单向路径.问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过 ...

  3. ACM_数数?诶?这么简单?

    数数?诶?这么简单? Time Limit: 2000/1000ms (Java/Others) Problem Description: 当看到GDUFE-GAME宣传海报上提到"场内人员 ...

  4. "HIBERNATE_SEQUENCE" does not exist问题处理

    JavaWeb应用在MySQL环境下可以正常运行,数据迁移至Oracle或者人大金仓后应用运行爆出如下错误: 严重: Servlet.service() for servlet [JeeCmsAdmi ...

  5. Service官方教程(1)Started与Bound的区别、要实现的函数、声明service

    Services 简介和分类 A Service is an application component that can perform long-running operations in the ...

  6. 转】SparkSQL中的内置函数

    原博文来自于: http://blog.csdn.net/u012297062/article/details/52207934    感谢! 使用Spark SQL中的内置函数对数据进行分析,Spa ...

  7. [书目20141009]《ReWork》

    ReWork1: ============= 引言篇INTRODUCTION开局篇FIRST 新的现实缷负篇TAKEDOWNS 忘了“现实世界” 哪来的从错误中学习 计划即瞎猜 何必壮大? 工作狂 受 ...

  8. Xml学习笔记(1)

    不同的xml文档构可能要用到不同的方法进行解析这里用到的是例如<student name="张三" id="1" sex="男"/&g ...

  9. 设计模式 -- Abstract Factory 抽象工厂

    1.常规的对象创建方法 //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对“具体实例化类型”额变化. 解决思想: 封装变化点--哪里变化,封装哪里( ...

  10. Sort排序浅聊

    集合是什么?笔者简易描述:数组是不可变的,所以我们使用集合来代替. using.System.Collections; 非泛型集合 using.System.Collections.Gernerc;泛 ...