题解:P12620 [NAC 2025] A Totient Quotient
前言
这种题也能想很久,彻底没救了。
Solution
由于不同质数之间都是相互独立的,我们可以先考虑一个质数的情况。
设
我们发现,若
然后我们考虑将
const ll V=10000;
ll cnt[N],cnt2[N];
ll a,b,m=1,n=1;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
//freopen("gcx.in","r",stdin);
//freopen("gcx.out","w",stdout);
a=read(),b=read();
For(i,2,sqrt(a)){
while(a%i==0) cnt[i]++,a/=i;
}
if(a>1) cnt[a]++;
For(i,2,sqrt(b)){
while(b%i==0) cnt2[i]++,b/=i;
}
if(b>1) cnt2[b]++;
Rof(i,V,2){
ll now=min(cnt[i],cnt2[i]);
cnt[i]-=now,cnt2[i]-=now;
if(cnt[i]){
if(cnt[i]&1){
For(j,1,cnt[i]/2+1) m*=i;
ll now=i-1;
For(j,2,sqrt(now)){
while(now%j==0) cnt2[j]++,now/=j;
}
if(now>1) cnt2[now]++;
}else{
m*=i,n*=i;
For(j,1,cnt[i]/2) m*=i;
}
}
if(cnt2[i]){
if(cnt2[i]&1){
For(j,1,cnt2[i]/2+1) n*=i;
ll now=i-1;
For(j,2,sqrt(now)){
while(now%j==0) cnt[j]++,now/=j;
}
if(now>1) cnt[now]++;
}else{
m*=i,n*=i;
For(j,1,cnt2[i]/2) n*=i;
}
}
}
cout<<m<<' '<<n<<endl;
return 0;
}