估分
查看原帖
估分
222057
joy2010WonderMaker楼主2022/3/26 19:11
#include<bits/stdc++.h>
using namespace std;
long long read(){
    char c=getchar();
	long long x=0;
	bool f=0;
    for(;!isdigit(c);c=getchar())
		f^=!(c^45);
    for(;isdigit(c);c=getchar())
		x=(x<<1)+(x<<3)+(c^48);
    if(f)
		x=-x;
	return x;
}
void write(long long x){
	if(x<0)
		putchar('-'),x-=x*2;
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
}
long long T,x,z,y,p[5000005],pos,idx,pr[50],pos1;
set<long long>s;
bool np[5000005];
void euler(int n){
	for(int i=2;i<=n;i++){
		if(!np[i])
			p[++pos]=i;
		for(int j=1;j<=pos&&i*p[j]<=n;j++){
			np[i*p[j]]=true;
			if(i%p[j]==0)
				break;
		}
	}
}
struct node{
	long long ls,x,len;
};
void bfs(long long len,long long d){
	queue<node>q;
	q.push({0,pr[d],len-1});
	while(!q.empty()){
		auto cur=q.front();
		q.pop();
		if(cur.len==0){
			long long tmp=cur.x;
			s.insert(tmp);
		}else{
			long long sd=cur.ls+1;
			long long x=pr[sd];
			q.push({sd,cur.x*pr[sd],cur.len-1});
			for(int i=sd+1;i<=pos1-cur.len+2;i++){
				if(pr[i]!=x)
					q.push({i,cur.x*pr[i],cur.len-1}),x=pr[i];
			}
		}
	}
}
int main(){
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	euler(5000000);
	T=read();
	while(T--){
		memset(pr,0,sizeof(pr));
		x=read(),z=read(),pos1=0;
		y=z/x;
		if(z%x!=0){
			puts("-1");
			continue;
		}
		idx=1;
		while(y>1&&p[idx]*p[idx]<=y){
			while(y%p[idx]==0){
				pr[++pos1]=p[idx];
				y/=p[idx];
			}
			idx++;
		}
		if(y)
			pr[++pos1]=y;
		bool f=false;
		for(int len=1;len<=pos1;len++){
			if(f)
				break;
			for(int j=1;j<=pos1-len+1;j++)
				bfs(len,j);
			for(auto &&it:s)
				if(it*x*__gcd(it,x)==z){
					write(it),puts("");
					f=true;
					break;
				}
			while(!s.empty())
				s.erase(*s.begin());
		}
		if(!f)
			puts("-1");
	}
	return 0;
}
2022/3/26 19:11
加载中...