简单易知存在ax+by=(a,b) 故ax'+by'=n,n必为(a,b)倍数
将%(a,b)的余数视为node,从u%(a,b)到0找最短路
dij优先队列维护花费,pre记录前导,num记录node对应的数字
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
int a,b,n,u,v,p;
int V[10],s[10],dis[100010],pre[100010],num[100010];
int gcd(int x,int y){
if(x%y==0) return y;
return gcd(y,x%y);
}
struct node{
int u,v;
bool operator<(const node &a)const{
return a.v<v;
}
};
priority_queue<node>q;
void print(int x){
if(pre[x]==-1){
cout<<u;
return;
}
print(pre[x]);
cout<<num[x];
}
int main(){
cin>>a>>b>>n;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++) cin>>V[s[i]];
cin>>u>>v;
p=gcd(a,b);
q.push({u,0});
pre[u]=-1;
memset(dis,0x3f,sizeof(dis));
dis[u]=0;
while(!q.empty()){
node u=q.top();
q.pop();
if((u.u*10+v)%p==0){
print(u.u);
cout<<v;
return 0;
}
for(int i=0;i<=9;i++)
if(V[i]){
int v=(u.u*10+i)%p;
if(dis[v]>dis[u.u]+V[i]){
dis[v]=dis[u.u]+V[i];
pre[v]=u.u;
num[v]=i;
q.push({v,dis[v]});
}
}
}
cout<<-1;
return 0;
}

京公网安备 11010502036488号