Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1488  Solved: 578

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。

Source

同余类最短路

在所有读入的a[i]中,找到最小的一个a为基准,在模a的意义下计算问题

假设通过一些数可以凑出x,使得x%a==j,那么通过累加a就可以凑出所有%a==j的大数。

设dis[i]表示能凑到的模a余i的最小数,SPFA算出dis数组,再利用dis计算Bmin~Bmax内可以凑出的数的个数。

一:刚开始写了建边的版本,但是因为要连的边太多了,常数爆炸,4000+ms通过

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct edge{
int v,nxt;
LL dis;
}e[mxn*];
int hd[mxn],mct=;
void add_edge(int u,int v,LL dis){
e[++mct].v=v;e[mct].nxt=hd[u];e[mct].dis=dis;hd[u]=mct;return;
}
int n;
LL B1,B2;
LL dis[mxn];
int a[];
bool inq[mxn];
queue<int>q;
void SPFA(){
memset(dis,0x3f,sizeof dis);
q.push();inq[]=;dis[]=;
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].dis){
dis[v]=dis[u]+e[i].dis;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
}
return;
}
LL query(LL x){
LL res=;
for(int i=;i<a[];i++){
if(dis[i]<=x)res+=(x-dis[i])/(LL)a[]+;
}
return res;
}
int main()
{
scanf("%d%lld%lld\n",&n,&B1,&B2);
int i,j;
for(i=;i<=n;i++){
a[i]=read();
if(!a[i]){i--;n--;}
}
sort(a+,a+n+); for(i=;i<=n;i++)
for(j=;j<a[];j++){
add_edge(j,(j+a[i])%a[],a[i]);
}
SPFA();
// for(i=0;i<a[1];i++)printf("%d ",dis[i]);
LL ans=query(B2)-query(B1-);
printf("%lld\n",ans);
return ;
}

邻接表

二:改成了不具体建边的写法,只需要1000+ms

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
LL B1,B2;
LL dis[mxn];
int a[];
bool inq[mxn];
queue<int>q;
void SPFA(){
memset(dis,0x3f,sizeof dis);
q.push();inq[]=;dis[]=;
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=;i<=n;i++){
int v=(u+a[i])%a[];
if(dis[v]>dis[u]+a[i]){
dis[v]=dis[u]+a[i];
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
}
return;
}
LL query(LL x){
LL res=;
for(int i=;i<a[];i++){
if(dis[i]<=x)res+=(x-dis[i])/(LL)a[]+;
}
return res;
}
int main()
{
scanf("%d%lld%lld\n",&n,&B1,&B2);
int i,j;
for(i=;i<=n;i++){
a[i]=read();
if(!a[i]){i--;n--;}
}
sort(a+,a+n+);
SPFA();
LL ans=query(B2)-query(B1-);
printf("%lld\n",ans);
return ;
}

Bzoj2118 墨墨的等式的更多相关文章

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

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

  2. 【BZOJ2118】墨墨的等式 最短路

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

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

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

  4. BZOJ2118: 墨墨的等式(同余类BFS)(数学转为图论题)

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2944  Solved: 1206[Submit][Status][Discu ...

  5. BZOJ2118:墨墨的等式(最短路)

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

  6. p2371&bzoj2118 墨墨的等式

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

  7. BZOJ2118: 墨墨的等式(最短路 数论)

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

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

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

  9. 【BZOJ 2118】 墨墨的等式(Dijkstra)

    BZOJ2118 墨墨的等式 题链:http://www.lydsy.com/JudgeOnline/problem.php?id=2118 Description 墨墨突然对等式很感兴趣,他正在研究 ...

随机推荐

  1. 获取iframe加载完毕事件

    function IframeLoad(o,fn) { if (document.all) { o.attachEvent('onload', fn); } else { o.onload = fn; ...

  2. mvc5 Html.EditorFor html属性有了新变化,和以前的不同了

    @Html.EditorFor(model => model.MaxNumber, new { htmlAttributes = new { @min = "1" } })

  3. WPF 绑定枚举值

    前台Xaml <ComboBox x:Name=" HorizontalAlignment="Left" Margin="5 0 0 0" Se ...

  4. spring+mybaties+springMvc+slf4j所需jar包

  5. 搭建企业内部yum仓库(centos6+centos7+epel源)

    搭建自己的yum仓库,将自己制作好的rpm包,添加到自己的yum源中. yum仓库服务端配置如下 : 1. 创建yum仓库目录 mkdir -p /data/yum_data/cd /data/yum ...

  6. C#利用iComparable接口实现List排序

    List<T>类可以使用Sort()方法对元素排序. Sort()方法定义了几个重载方法,分别是  public void List<T>.Sort(),不带有任何参数的Sor ...

  7. SpringMVC学习--数据回显

    简介 表单提交失败需要再回到表单页面重新填写,原来提交的数据需要重新在页面上显示. 简单数据类型 对于简单数据类型,如:Integer.String.Float等使用Model将传入的参数再放到req ...

  8. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  9. openwrt的环境搭建、定制和编译

    参考1:编译openwrt全过程 参考2: ARM9的OpenWRT系统的移植以及 无线视觉操控系统的软件开发 参考3:搭建OpenWrt开发环境(包括编译过程) 参考4:各个openwrt版本的sv ...

  10. SQL 常用函数及示例

    --SQL 基础-->常用函数 --================================== /* 一.函数的分类 SQL函数一般分为两种 单行函数 基于单行的处理,一行产生一个结果 ...