为了能到远方,脚下的每一步都不能少.|

luckydrawbox

园龄:4个月粉丝:1关注:2

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;
}

本文作者:luckydrawbox

本文链接:https://www.cnblogs.com/luckydrawbox/p/18526539

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   luckydrawbox  阅读(3)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起