被hack一早晨了,到底哪里有问题啊
#include<bits/stdc++.h>
#define int long long
using namespace std;
int head[5000010],cnt,d[5000005],n,l,r,w[50];
bool vis[5000005];
struct node{
int to,next,w;
}a[5000005];
queue<int>q;
void add(int u,int v,int w)
{
a[++cnt]={v,head[u],w};
head[u]=cnt;
}
struct edge{
int w,to;
bool operator <( const edge &x )const
{
return x.w < w;
}
};
void dijkstra(int s)
{
priority_queue<edge>q;
memset(d,0x7f,sizeof d);
d[s]=0;
q.push({0,s});
while(!q.empty())
{
int x=q.top().to;
int y=q.top().w;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];~i;i=a[i].next)
{
int l=a[i].to;
int r=a[i].w;
if(d[x]+r<d[l])
{
d[l]=d[x]+r;
if(!vis[l])
{
q.push({d[x]+r,l});
}
}
}
}
}
signed main()
{
memset(head,-1,sizeof head);
scanf("%lld%lld%lld",&n,&l,&r);
bool flag=0;
int len=0;
for(int i=1;i<=n;i++)
{
int x;
scanf("%lld",&x);
if(x) flag=1,w[++len]=x;
}
sort(w+1,w+n+1);
int mi=w[1];
for(int i=0;i<mi;i++)
{
for(int j=2;j<=len;j++) add(i,(i+w[j])%mi,w[j]);
}
dijkstra(0);
int ans1=0,ans2=0;
for(int i=0;i<mi;i++)
{
if(d[i]<=r) ans1+=((r-d[i])/mi+1LL);
if(d[i]<l) ans2+=((l-d[i]-1LL)/mi+1LL);
}
printf("%lld",ans1-ans2);
return 0;
}