获得3rmb的要求是把这个代码改对()
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define int __int128
#define in_t int
#define rep(i,x,y) for( int i=x;i<=y;i++)
using namespace std;
long long n,m,k,t;
map<long long ,long long >id;
long long cnt;
vector<long long >v[1145];
__int128 x,y;
__int128 exgcd(__int128 a,__int128 b){
if(b==0){
x=1,y=0;
return a;
}
__int128 d=exgcd(b,a%b);
__int128 x0=y,y0=x-y*(a/b);
x=x0,y=y0;
return d;
}
struct node{
long long v,w;
};
vector<node>G[114][114];
long long solved[1145];
long long dis[55][10055];
long long vis[114514];
void spfa(long long idx){
queue<long long >q;
q.push(0);
memset(vis,0,sizeof(vis));
for(int i=1;i<=v[idx][v[idx].size()-1];i++){
dis[idx][i]=(1ll<<60);
}
dis[idx][0]=0;
while(!q.empty()){
long long u=q.front();
q.pop();
vis[u]=0;
for(register int i=0;i<G[idx][u].size();i++){
long long v=G[idx][u][i].v,w=G[idx][u][i].w;
if(dis[idx][u]+w<dis[idx][v]){
dis[idx][v]=dis[idx][u]+w;
if(vis[v]==0){
vis[v]=1;
q.push(v);
}
}
}
}
}
const int mx=3.2e7;
bool ols[mx];
vector<long long >pr;
signed main(){
cin>>t;
// memset(ols,1,sizeof(ols))
for(long long i=2;i<mx;i++){
if(ols[i]==0) {
pr.push_back(i);
}
for(int j=0;j<pr.size()&&pr[j]*i<mx;j++){
ols[pr[j]*i]=1;
// cout<<pr[j]<<' '<<i<<endl;
if(i%pr[j]==0) break;
}
}
while(t--){
// cin>>n>>k;
scanf("%lld %lld",&n,&k);
long long idx=id[k];
if(id[k]==0){
cnt++;
id[k]=cnt;
idx=cnt;
// for(register int )
for(long long j=0;j<pr.size()&&pr[j]*pr[j]<=k;j++){
int i=pr[j];
// cout<<i<<' ';
if(k%i==0){
k/=i;
v[cnt].push_back(i);
while(k%i==0) k/=i;
}
}
if(k>1) v[cnt].push_back(k);
}
int sz=v[idx].size();
if(sz==0) cout<<"NO\n";
else if(sz==1){
if(n%v[idx][0]==0) cout<<"YES\n";
else cout<<"NO\n";
}else if(sz==2){
__int128 a=v[idx][0],b=v[idx][1];
__int128 d=exgcd(a,b);
x*=n,y*=n;
__int128 p=b/d,q=a/d;
// cout<<x<<' '<<y<<endl;
if(x<0){
__int128 k=(0-x+p-1)/p;
x+=p*k;
y-=q*k;
}
if(y<0){
__int128 k=(0-y+q-1)/q;
x-=p*k;
y+=q*k;
}
// cout<<a<<' '<<b<<endl;
// cout<<x<<' '<<y<<endl;
if(x>=0&&y>=0) cout<<"YES\n";
else cout<<"NO\n";
}else {
if(solved[idx]==0){
sort(v[idx].begin(),v[idx].end());
rep(i,1,sz-1){
rep(j,0,v[idx][0]-1){
// cout<<"addedge:"<<j<<' '<<(j+v[idx][i])%v[idx][0]<<' '<<v[idx][i]<<endl;
G[idx][j].push_back(node{(j+v[idx][i])%v[idx][0],v[idx][i]});
}
}
spfa(idx);
solved[idx]=1;
}
if(n>=dis[idx][n%v[idx][0]]) cout<<"YES\n";
else cout<<"NO\n";
}
}
return 0;
}