タイトル
Slastyonaと彼女の忠実な犬Pushokは、非常に興味深い無意味なゲームをプレイしています。
ゲームは複数のラウンドで構成されています。そのルールは非常に単純です。各ラウンドで、自然数kkが選択されます。次に、他の人より速く言う(または鳴く)方がラウンドに勝ちます。その後、勝者のスコアは\(k ^ {2} \)で乗算され、敗者のスコアはkkで乗算されます。ゲームの開始時に、SlastyonaとPushokのスコアはどちらも1です。
残念ながら、Slastyonaはすべてのnnゲームの履歴が記録されたメモ帳を紛失してしまいました。彼女は各ゲームの最終結果を思い出すことができましたが、それらのすべての彼女の思い出は曖昧です。Slastyonaが正しさを確認できるようにするか、言い換えると、与えられたスコアのペアごとに、ゲームがそのような結果で終了することが可能かどうかを判断します。
Slastyonaと彼女の忠実な犬Pushkは、意味がありませんが楽しいゲームをプレイしています。ゲームには複数のラウンドが含まれています。
そのルールは非常に単純です。最初に自然数\(k \)を選択します。次に、他の人よりも速く(または鳴き)言った人がラウンドに勝ちます。その後、勝者のスコアはkの2乗で乗算され、敗者のスコアはkでのみ乗算できます。ゲームの開始時に、SlastyonaとPurSokにはそれぞれ初期スコアがありました。残念ながら、Slastyonaはメモ帳を紛失しました。メモ帳には、Nゲームの履歴が記録されています。彼女は各ゲームの最終結果をなんとか思い出すことができましたが、彼女の記憶はあいまいでした。Slastyonaが正しさを確認できるようにしてください。つまり、与えられたスコアの各ペアについて、ゲームがそのような結果を達成できるかどうかを判断します。
入力フォーマット
最初の文字列では、ゲーム数\(n(1≤n≤350000)\)が指定されています。
各ゲームは、スコアa、\(b( 1≤a、b≤109 )\)のペアで表されます– SlastyonaとPushokの結果に対応します。
出力フォーマット
スコアの各ペアについて、特定のスコアでゲームを終了できる場合は「はい」、それ以外の場合は「いいえ」と答えてください。
それぞれの文字を任意のケース(大文字または小文字)で出力できます。
入力例
6
2 4
75 45
8 8
16 16
247 994
1000000000 1000000
出力例
Yes
Yes
Yes
No
No
Yes
解決策
集合\(A \)とは、\(B \)二人のためのゲームのスコアです\(A \)と\(B \) 、ゲームラウンドではありません(A \ CDOT K = \ 、B = Bを\ cdot k ^ 2 \)、つまり\(a = a \ cdot k ^ 2、b = b \ cdot k \)、ゲームのすべてのラウンドで、\(a \ cdot b \)の合計は\(k ^ 3 \)、最後の3つは整数で区切る必要があります。これは、これが存在する可能性があることを示します。
ただし、この条件では不十分であることに注意してください。
キューブの結果が\(a \)と\(b \)の因数であるという条件もあります。
\(\ because ab = k ^ {3n} \)
$ \ therefore \ sqrt [3] {ab} = \ sqrt [3] {k ^ {3n}} = k ^ n $
\(p \)ゲームがプレイされ、\(a \)または\(b \)が少なくとも\(p \)倍\(k \)倍され、次に\(k ^ n \)(オープンキューブの結果)が乗算されていると想定されます。\(a \)と\(b \)の因数でなければなりません
逆も真です。\(\ sqrt [3] {ab} = k ^ n \)が整数で、\(k ^ n \)が\(a \)と\(b \)の因数である場合、スコアは法的
コード
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
scanf("%d", &t);
while (t--) {
long long a, b;
scanf("%lld%lld", &a, &b);
long long m = pow(a * b, (1.0 / 3)) + 0.5;
puts((m * m * m != a * b || a % m || b % m) ? "No" : "Yes");
}
return 0;
}