P8255 [NOI Online 2022 普及组] 数学游戏

Link\text{Link}

题意

已知 z=x×y×gcd(x,y)z=x\times y\times \gcd(x,y)xxzz,求 yy

分析

不妨设 d=gcd(x,y),x=dn,y=dmd=\gcd(x,y),x=dn,y=dm,那么有 z=d3nmz=d^3nm,所以 zx=d2m\frac{z}{x}=d^2m

由最大公约数的定义得,nnmm 互质,因此 n2n^2mm 也互质,凭直觉可以得到 gcd(x2,zx)=gcd(d2n2,d2m)=d2\gcd(x^2,\frac{z}{x})=\gcd(d^2n^2,d^2m)=d^2,于是可以求出 d=gcd(x2,zx)d=\sqrt {\gcd(x^2,\frac{z}{x})},因此 y=zxd=zxgcd(x2,zx)y=\dfrac{\frac{z}{x}}{d}=\dfrac{\frac{z}{x}}{\gcd(x^2,\frac{z}{x})},只要判断求出来的 yy 是否符合要求就可以了。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
	long long x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=2e5+10;
ll t,z,x,d,y;
ll gcd(ll a,ll b){
	return (b==0?a:gcd(b,a%b));
}
int main(){
	t=read();
	while(t--){
		x=read();z=read();
		d=sqrt(gcd(z/x,x*x));
		y=z/x/d;
		if(y*d*x==z&&gcd(x,y)==d){
		    write(y);
		    puts("");
		}
		else
			puts("-1");
	}
	return 0;
}
posted @ 2022-03-26 18:23  luckydrawbox  阅读(12)  评论(0)    收藏  举报  来源