[NOI Online 2022 入门组] 数学游戏

P8255 [NOI Online 2022 入门组] 数学游戏

注:妙哉,此题可以理解为数学题。

思路

由题易得:

z=dx×dy×gcd(x,y)3x=dx×gcd(x,y)y=dy×gcd(x,y)

d=gcd(x,y),此时有dxdy

可以得到只要证明出d的表达式,即可解题。

c=z/x=dy×d2gcd(c,x2)=gcd(dy×d2,dx2×d2)=d2×gcd(dy,dx2)=d2d2=gcd(c,x2)d=(gcd(c,x2))

所以无解的情况有以下两种:

  • xz
  • d2解出来不是平方数

题目大概是这样,但这里可能会有一个疑惑:

  • 为什么不可以直接d=gcd(c,x)=gcd(dy×d2,dx×d),反正dxdy

    其实这是显然的,因为不保证dxd,所以结果不会为d

总结

当遇到像c=dy×d2,x=dx×d时,不妨将x平方一下,使目标数的次数相同。

CDOE

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn =1e8+32;

inline ll read_int(){
    ll a=0,f=1,g=getchar();
    while(g<'0'||g>'9'){if(g=='-') f=-1;g=getchar();}
    while(g>='0'&&g<='9') a=a*10+g-'0',g=getchar();
    return a*f;
}

inline void write(ll a,ll b){
    if(a<0) a=-a,putchar('-');
    ll lin[40],cnt=0;
    while(a) lin[++cnt]=a%10,a/=10;
    if(!cnt) cnt++,lin[cnt]=0;
    while(cnt) putchar(lin[cnt]+'0'),cnt--;
    if(b) putchar('\n');
}

inline ll gcd(ll a,ll b) {return b==0 ? a : gcd(b,a%b);}

inline void read(){
	ll x=read_int(),z=read_int();
	if(z%x) {write(-1,1);return;}
	z/=x;
	ll G=gcd(z,x*x);
	ll lin=sqrt(G);
	if(lin*lin!=G) {write(-1,1);return;}
	write(z/lin,1);
}

int main (){
	ll t=read_int();
	while(t--) read();
} 
posted @   轩Demonmaster  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示