悬赏3RMB求助RE on 12
查看原帖
悬赏3RMB求助RE on 12
253765
houpingze楼主2024/9/13 21:46

获得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;
}
2024/9/13 21:46
加载中...