求大佬帮帮忙(95pts Wa#1#21)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=7e6+5;
ll n,l,r,dis[N],b[N],mn=N*N;
struct data {
ll v,w;
};
priority_queue<data> q;
bool operator < (data xxx,data yyy) {
return xxx.w>yyy.w;
}
vector<data> v[N];
void dij() {
while(!q.empty()) q.pop();
memset(dis,0x3f,sizeof(dis));
q.push({1,0});
dis[1]=0;
while(!q.empty()) {
ll x=q.top().v,y=q.top().w;
q.pop();
for(ll i=0;i<v[x].size();i++) {
data num=v[x][i];
ll xx=num.v,yy=num.w;
if(dis[xx]>y+yy) {
dis[xx]=y+yy;
q.push({xx,y+yy});
}
}
}
}
ll add(ll x) {
ll ans=0;
for(ll i=0;i<mn;i++) {
if(dis[i]<=x) ans+=(x-dis[i])/mn+1;
}
return ans;
}
int main() {
cin>>n>>l>>r;
for(ll i=1;i<=n;i++) {
cin>>b[i];
mn=min(mn,b[i]);
}
for(ll i=0;i<mn;i++) {
for(ll j=1;j<=n;j++) {
v[i].push_back({(i+b[j])%mn,b[j]});
}
}
dij();
cout<<add(r)-add(l-1);
return 0;
}