题目地址
题意:告诉你两个人的初始分都是1,他会进行若干盘游戏,每盘游戏选定这个自然数k,然后比赛,赢的人得到k^2分,输的人得到k分,然后告诉你终止分为a,b,问这个终止分是不是对的。
思路:因为两人都会是全部k的乘积的倍数,所以二分枚举全部k的乘积得到sum,如果sum^3=a*b,则那么这个值是对的,最后判断下是不是a和b都是这个的倍数以及sum^3=a*b就好了。
PS:r的范围为1e6的原因是,a和b的范围为1e9,所以a*b的范围为1e18,所以枚举1e6的范围就好了
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstdio>
#include <utility>
#include <algorithm>
#include <functional>
#define N 100010
#define LL long long
#define inf 0x3f3f3f3f
#define lson l,mid,ans<<1
#define rson mid+1,r,ans<<1|1
using namespace std;
const LL mod = 1e9 + 7;
const double eps = 1e-9;
int main() {
LL a, b, c;
int n;
while (~scanf("%d",&n)) {
while (n--) {
scanf("%lld %lld", &a, &b);
c = a*b;
LL l = 1, r = 1000005, mid;
while (l <= r) {
mid = (l + r) / 2;
if (mid*mid*mid >= c) {
r = mid - 1;
}
else {
l = mid + 1;
}
}
LL ans = r + 1;
if (ans*ans*ans != c || (a%ans != 0) || (b%ans != 0)) {
printf("No\n");
}
else {
printf("Yes\n");
}
}
}
return 0;
}