rt,后来重写了一个spfa过了,但这个dijkstra为什么不对...
#include <bits/stdc++.h>
#define in inline
#define rint register int
#define r(a) runtimerror(a)
#define w(a) wronganswer(a)
#define wl(a) wronganswer(a);putchar('\n')
#define ws(a) wronganswer(a);putchar(' ')
using namespace std;
typedef long long ll;
int tot,head[100010];
ll x,y,z,ans,h,cost[100010];
bool vis[100010];
template <typename t> void wronganswer(t a){
if(a<0) putchar('-'),a=-a;
if(a>9) wronganswer(a/10);
putchar(a%10^48);
}
template <typename t> in void runtimerror(t &a){
char ch=getchar();
t x=1,f=0;
while(!isdigit(ch)){
if(ch=='-') x=-1;
ch=getchar();
}
while(isdigit(ch)){
f=(f<<3)+(f<<1)+(ch^48);
ch=getchar();
}
a=x*f;
}
struct Edge{
int to,nex,cost;
}edge[200010];
in void add_edge(int from,int to,int cost){
edge[++tot]={to,head[from],cost};
head[from]=tot;
}
in void dijkstra(){
q.push({1,1});
memset(cost,0x3f,sizeof(cost));
cost[1]=1;
while(!q.empty()){
a=q.top();
q.pop();
if(vis[a.id]) continue;
vis[a.id]=true;
for(rint i=head[a.id];i;i=edge[i].nex){
if(cost[edge[i].to]>a.cost+edge[i].cost){
cost[edge[i].to]=a.cost+edge[i].cost;
q.push({edge[i].to,cost[edge[i].to]});
}
}
}
}
int main(){
r(h),r(x),r(y),r(z);
if(x==1||y==1||z==1){
w(h);
return 0;
}
for(rint i=0;i<x;i++){
add_edge(i,(i+y)%x,y);
add_edge(i,(i+z)%x,z);
}
dijkstra();
for(rint i=0;i<x;i++){
if(h>=cost[i]) ans+=(h-cost[i])/x+1;
}
w(ans);
return 0;
}