NOIOLPJ2022B. 数学游戏 分析

数学游戏

题目描述

Kri 喜欢玩数字游戏。

一天,他在草稿纸上写下了 ttt 对正整数 (x,y)(x,y)(x,y),并对于每一对正整数计算出了 z=x×y×gcd⁡(x,y)z = x \times y \times \gcd(x,y)z=x×y×gcd(x,y)

可是调皮的 Zay 找到了 Kri 的草稿纸,并把每一组的 yyy 都擦除了,还可能改动了一些 zzz

现在 Kri 想请你帮忙还原每一组的 yyy,具体地,对于每一组中的 xxxzzz ,你需要输出最小的正整数 yyy,使得 z=x×y×gcd⁡(x,y)z=x \times y \times \gcd(x,y)z=x×y×gcd(x,y)。如果这样的 yyy 不存在,也就是 Zay 一定改动了 zzz,那么请输出 −1-11

注: gcd⁡(x,y)\gcd(x,y)gcd(x,y) 表示 xxxyyy 的最大公约数,也就是最大的正整数 ddd,满足 ddd 既是 xxx 的约数,又是 yyy 的约数。

输入格式

第一行一个整数 ttt,表示有 ttt 对正整数 xxxzzz

接下来 ttt 行,每行两个正整数 xxxzzz,含义见题目描述。

输出格式

对于每对数字输出一行,如果不存在满足条件的正整数 yyy,请输出 −1-11,否则输出满足条件的最小正整数 yyy

输入数据 1

1
10 240
Copy

输出数据 1

12
Copy

样例 1 解释

x×y×gcd⁡(x,y)=10×12×gcd⁡(10,12)=240x \times y \times \gcd(x,y) = 10 \times 12 \times \gcd(10,12) = 240x×y×gcd(x,y)=10×12×gcd(10,12)=240

输入数据 2

3
5 30
4 8
11 11
Copy

输出数据 2

6
-1
1
Copy

附加样例

见样例目录下的 math3.inmath3.out ,以及 math4.inmath4.out

数据范围

对于 20%20\%20% 的数据,t,x,z≤103t,x,z \le 10^3t,x,z103

对于 40%40\%40% 的数据,t≤103,x≤106,z≤109t \le 10^3,x \le 10^6,z \le 10^9t103,x106,z109

对于另 30%30\%30% 的数据,t≤104t \le 10^4t104

对于另 20%20\%20% 的数据,x≤106x \le 10^6x106

对于 100%100\%100% 的数据,1≤t≤5×105,1≤x≤109,1≤z<2631 \le t \le 5 \times 10^5,1 \le x \le 10^9,1 \le z < 2^{63}1t5×105,1x109,1z<263

题意简述

  • 给定正整数 x,zx,zx,z,求满足 z=x×y×gcd⁡(x,y)z=x\times y\times\gcd(x,y)z=x×y×gcd(x,y) 的最小正整数 yyy,若不存在,输出 −1-11

  • 每个测试点有 ttt 次询问。

  • 1≤t≤5×1051\leq t\leq 5\times 10^51t5×1051≤x≤1091\leq x\leq 10^91x1091≤z≤2631\leq z\leq 2^{63}1z263

题目分析

方法一

x,y,zx,y,zx,y,z 中分别含有 x1,y1,z1x_1,y_1,z_1x1,y1,z1 个素因子 222,则 gcd⁡(x,y)\gcd(x,y)gcd(x,y) 中含有 min⁡(x1,y1)\min(x_1,y_1)min(x1,y1) 个素因子 222

根据条件 z=x×y×gcd⁡(x,y)z=x\times y\times\gcd(x,y)z=x×y×gcd(x,y)z1=x1+y1+min⁡(x1,y1)z_1=x_1+y_1+\min(x_1,y_1)z1=x1+y1+min(x1,y1),接着根据 x1x_1x1y1y_1y1 的大小关系进行分类讨论:

  • x1>y1x_1>y_1x1>y1
    此时 z1=x1+2y1z_1=x_1+2y_1z1=x1+2y1,且 x1>y1⇔3x1>z1x_1>y_1\Leftrightarrow 3x_1>z_1x1>y13x1>z1。注意 z1−x1z_1-x_1z1x1 必须为偶数,否则 y1y_1y1 会出现小数的情况。

  • x1≤y1x_1\leq y_1x1y1
    此时 z1=2x1+y1z_1=2x_1+y_1z1=2x1+y1,且 x1≤y1⇔3x1≤z1x_1\leq y_1\Leftrightarrow 3x_1\leq z_1x1y13x1z1

综上,y1={z1−x12=z1−x12−z12,3x1>z1z1−2x1=z1−x12−3x12,3x1≤z1=z1−x12−min⁡(3x1,z1)2y_1=\begin{cases} \dfrac{z_1-x_1}2=z_1-\dfrac{x_1}2-\dfrac{z_1}2,&3x_1>z_1\\ z_1-2x_1=z_1-\dfrac{x_1}2-\dfrac{3x_1}2,&3x_1\leq z_1 \end{cases}=z_1-\dfrac{x_1}2-\dfrac{\min(3x_1,z_1)}2y1= 2z1x1=z12x12z1,z12x1=z12x123x1,3x1>z13x1z1=z12x12min(3x1,z1)

同理,对于其他素因子,也满足上文所述。

再将这个等式转化成 x,y,zx,y,zx,y,z 的形式:

y=zx÷gcd⁡(x3,z)=zx÷gcd⁡(zx,x2)y=\dfrac z{\sqrt{x}}\div\sqrt{\gcd(x^3,z)}=\dfrac zx\div\sqrt{\gcd\left(\dfrac zx,x^2\right)} y=x z÷gcd(x3,z) =xz÷gcd(xz,x2)

方法二

g=gcd⁡(x,y)g=\gcd(x,y)g=gcd(x,y),得

z=xyg⇒zx=yg⇒zx=yg×g2z=xyg \Rightarrow\dfrac zx=yg \Rightarrow\dfrac zx=\dfrac yg\times g^2z=xygxz=ygxz=gy×g2

根据最大公约数性质,我们有 gcd⁡(xg,yg)=1\gcd\left(\dfrac xg,\dfrac yg\right)=1gcd(gx,gy)=1,可得

gcd⁡(zx,x2)=gcd⁡[yg×g2,(xg)2×g2]=g2⇒g=gcd⁡(zx,x2)⇒y=zx÷gcd⁡(zx,x2)\begin{aligned} &\gcd\left(\dfrac zx,x^2\right)=\gcd\left[\dfrac yg\times g^2,\left(\dfrac xg\right)^2\times g^2\right]=g^2\\ \Rightarrow&g=\sqrt{\gcd\left(\dfrac zx,x^2\right)} \Rightarrow y=\dfrac zx\div\sqrt{\gcd\left(\dfrac zx,x^2\right)}\end{aligned}gcd(xz,x2)=gcd[gy×g2,(gx)2×g2]=g2g=gcd(xz,x2) y=xz÷gcd(xz,x2)

根据上述两种方法,均可证明 y=zx÷gcd⁡(zx,x2)y=\dfrac zx\div\sqrt{\gcd\left(\dfrac zx,x^2\right)}y=xz÷gcd(xz,x2) ,故直接计算此式即可。

时间复杂度 Θ(tlog⁡x2)\Theta(t\log x^2)Θ(tlogx2)。(注意计算 gcd⁡\gcdgcd 的时间复杂度)

你可能感兴趣的:(NOI,比赛,C++,游戏,算法,数学建模,数据结构,c++,动态规划,汇编)