游戏

题目

有一天, 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;
}
复制代码

 

posted on   哈弥勒2  阅读(170)  评论(0编辑  收藏  举报

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示