我真不想寫背景
題目描述
某巨魔突然對等式很感興趣,他正在研究
他要求你編寫一個程序,給定
輸入格式
輸入的第一行包含
輸入的第二行包含
輸出格式
輸出一個整數,表示有多少
樣例輸入
2 5 10
3 5
樣例輸出
5
樣例解釋
對於
對於
對於
對於
對於
對於
數據範圍
Solution
因爲
對於模
則對於每一個
那麼,如何求出
現已知
設
則
這就是一個最短路模型,每次用
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#define LL long long
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;
LL n,bmi,bma,ans;
LL a[20],dis[400010];
bool in_stack[400010];
queue<LL>q;
void spfa(){
memset(dis,-1,sizeof dis);
dis[0]=0;q.push(0);in_stack[0]=true;
while(!q.empty()){
LL now=q.front();
q.pop();in_stack[now]=false;
for(LL i=2;i<=n;i++){
LL tmp=now+a[i],qq=0;
while(tmp>a[1]){
tmp-=a[1];
qq++;
}
if(dis[tmp]==-1||dis[tmp]>dis[now]+qq){
dis[tmp]=dis[now]+qq;
if(!in_stack[tmp]){
in_stack[tmp]=true;
q.push(tmp);
}
}
}
}
}
int main(){
freopen("wth.in","r",stdin);
freopen("wth.out","w",stdout);
scanf("%lld%lld%lld",&n,&bmi,&bma);
for(LL i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1);
spfa();
for(LL i=0;i<a[1];i++)if(dis[i]!=-1){
LL tmp=i+dis[i]*a[1];
if(tmp>bma)continue;
ans+=(bma-tmp)/a[1]-Max((LL)(ceil(((double)bmi-tmp)/a[1])),0)+1;
}
printf("%lld\n",ans);
return 0;
}