1. 程式人生 > >bzoj2118 墨墨的等式

bzoj2118 墨墨的等式

data content sizeof esc name nbsp 編寫一個程序 值範圍 memory

2118: 墨墨的等式

Time Limit: 10 Sec Memory Limit: 259 MB

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。

Tips:

  此題不作多講,看代碼即可;

Code:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define MOD 500008
using namespace std;
long long a[18],tot,n;
long long qu[500008],d[500008],st,ed;
long long l,r;
bool boo[500008]; long long query(long long maxx){ long long res=0; for(int i=0;i<a[1];i++){ if(d[i]<=maxx){ res+=(maxx-d[i])/a[1]+1; } } return res; } int main(){ tot=0; scanf("%lld%lld%lld",&n,&l,&r); for(int i=1;i<=n;i++){ scanf(
"%lld",&a[i]); if(!a[i]) { i--; n--; continue; } } sort(a+1,a+n+1); for(int i=1;i<a[1];i++) d[i]=r+1; d[0]=0; memset(boo,0,sizeof(boo)); qu[1]=0; boo[0]=true; st=0; ed=1; while(st!=ed){ st=st%MOD+1; int x=qu[st]; for(int i=1;i<=n;i++){ int y=(x+a[i])%a[1]; if(d[y]>d[x]+a[i]){ d[y]=d[x]+a[i]; if(!boo[y]){ boo[y]=false; ed=ed%MOD+1; qu[ed]=y; } } } boo[x]=0; } printf("%lld\n",query(r)-query(l-1)); }

bzoj2118 墨墨的等式