J - The Meaningless Game CodeForces - 834C

     if(a*a%b == 0&&b*b%a == 0) 这一步特别重要

例如3,7. 他们的积是21.符合要求3*3*3=21.但是应该输出no。

因为7和3无法由k累乘获得。我们要保证a和b有同一个约数。



  1. #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    long long mid;
    bool find(ll m)
    {
        int l = 1,r = 1e6;//1e6的三次幂就是1e18,正好是1e9的平方
        while(l<= r)//二分查找
        {
            mid = (l+r)/2;
            if(mid*mid*mid == m)
                return 1;
            if(mid*mid*mid< m)
                l = mid+1;
            else
                r = mid-1;
        }
        return 0;
    }




    int main()
    {
        int n;
        cin>>n;
        while(n--)
        {
            ll a,b;
            scanf("%lld %lld",&a,&b);
            if(find(a*b))
            {
                if((a%mid==0||mid%a==0)&&(b%mid==0||mid%b==0))
                printf("YES\n");             //能找到某个数的3次方等于a*b只是必要条件,还要加上上面一条才可以
            else
                printf("NO\n");
            }
            else
            {
                 printf("NO\n");
            }
        }


        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值