游戏

题目

有一天, krydom 和 darkflames 在 Van You See 。
一开始,2 个人的分数都是 1 。
每一个回合,可以任意选择一个数 k,然后 krydom 和 darkflames 猜拳,
赢的人把自己的分数 *k^2,输的人把自己的分数 *k。
但是 krydom 变成了老年选手,记忆力衰退,一共(仿佛)回忆起了 n 局
比赛的最后两个人的分数 Xi, Yi,但是不确定。现在 krydom 想知道对于这 n
场比赛,每场比赛的最后结果是否有可能是 Xi, Yi。 【输入格式】
第一行包含一个整数 n ,表示比赛的局数。
接下来 n 行,每行两个整数 Xi, Yi,表示一个询问。 【输出格式】
一共 n 行,每行输出 Yes 或者 No 。
表示第 i 场比赛的结果是否有可能是 Xi, Yi 。 【输入输出样例】
Input1
3
2 4
75 45
8 8
Output1
Yes
Yes
Yes
Input2
3
16 16
247 994
1000000000 1000000
Output2
No
No
Yes
NOIP2019 模拟赛
第 8页 共 8页
【样例解释】
样例 1 解释:
1、2 = 2 4 = (2*2)
2、75 = (5*5)*3 49 = 5*(3*3)
3、8 = 2*(2*2) 8 = (2*2)*2
【数据范围】
对于 20% 的数据满足:n ≤ 10, Xi, Yi ≤ 10 。
对于 50% 的数据满足:x ≤ 350000, Xi, Yi ≤ 100 。
对于 100%的数据满足:n ≤ 350000, Xi, Yi ≤ 10^9


思路

设 tmp =a*b的立方根。
如果 tmp 不是整数,显然是 No
否则怕判断 tmp 是不是 a 和 b 的因数
如果 tmp 不是 a 的因数或者不是 b 的因数,就是
No
否则都是 Yes


代码

#include<bits/stdc++.h>
using namespace std;
long long a, b, tmp, ans;
int n;
void work()
{
    scanf("%lld%lld",&a,&b);
    tmp=a*b;ans=0;
    int l=1,r=1e6;
    while(l<=r)
    {
        long long mid=(l+r)>>1;
        if(mid*mid*mid==tmp)
        {
            ans=mid;
            break;
        }
        if(mid*mid*mid<tmp)
            l=mid+1; 
        else 
            r=mid-1;
    }
    if(!ans) 
    {
        cout<<"No"<<endl;
        return;
    }
    if(a%ans==0&&b%ans==0)
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
}

int main()
{
    scanf("%d",&n);
    while (n--)
    work();
    return 0;
}
原文地址:https://www.cnblogs.com/abcdhh/p/11191497.html