不懂,样例我的程序输出4,实际应该是5
调了好久都没找到哪里有错,最后想先交一发看看能拿多少分的时候,结果AC了((
有无大佬能帮忙看看我的程序哪里有问题?
代码如下::
#include <bits/stdc++.h>
#define ll long long
#define pli pair<ll,int>
#define mkp(x,y) make_pair(x,y)
using namespace std;
const int maxn=15;
const int maxm=5e5+5;
struct edge{
int to,next;
ll w;
}e[maxn*maxm];
int n,tot,h[maxm];
bool vis[maxm];
ll l,r,ans,a[maxn],d[maxm];
priority_queue <pli,vector<pli>,greater<pli> > q;
inline void addEdge(int x,int y,ll z){
e[++tot]=(edge){y,h[x],z};
h[x]=tot;
}
inline void dijkstra(){
memset(d,0x3f,sizeof(d));
d[0]=0;
q.push(mkp(d[0],0));
while (!q.empty()){
int now=q.top().second;
q.pop();
if (vis[now]) continue;
vis[now]=true;
for (int i=h[now];i;i=e[i].next){
int v=e[i].to;
if (d[v]>d[now]+e[i].w){
d[v]=d[now]+e[i].w;
q.push(mkp(d[v],v));
}
}
}
}
int main(){
scanf("%d%lld%lld",&n,&l,&r);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
for (int i=0;i<a[1];i++) for (int j=2;j<=n;j++) addEdge(i,(i+a[j])%a[1],a[j]);
dijkstra();
for (int i=0;i<a[1];i++){
if (r>=d[i]) ans+=(r-d[i])/a[1]+1;
if (l>=d[i]) ans-=(l-1-d[i])/a[1]+1;
}
printf("%lld\n",ans);
return 0;
}