40分 re 求助
查看原帖
40分 re 求助
347662
henhen_楼主2023/7/20 16:39
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e6+10;
int head[N],cnt,vis[N],tot,a[N],dis[N];
int n,l,r,minn=LLONG_MAX;
queue<int>q;
inline void spfa(){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	q.push(0);
	vis[0]=1;
	dis[0]=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=1;i<=tot;i++){
			if(a[i]==minn)continue;
			int y=(x+a[i])%minn;
			if(dis[y]>dis[x]+a[i]){
				dis[y]=dis[x]+a[i];
				if(!vis[y]){
					q.push(y);
					vis[y]=1;
				}
			}
		}
	}
}
inline int query(int now){
	int ans=0;
	for(int i=0;i<now;i++){
		if(dis[i]<=now){
			ans+=(now-dis[i])/minn+1;
		}
	}
	return ans;
}
signed main(){
	scanf("%lld%lld%lld",&n,&l,&r);
	for(int opt,i=1;i<=n;i++){
		scanf("%lld",&opt);
		if(opt>0){
			a[++tot]=opt;
			minn=min(minn,opt);
		}
	}
	spfa();
	printf("%lld",query(r)-query(l-1));
}
2023/7/20 16:39
加载中...