Codeforces Round #426 (Div. 2) C. The Meaningless Game

题目链接:The Meaningless Game

题目大意:有两个数,初始值都是1,现在他们可以互相博弈很多轮,赢的人可以在原本值得基础上乘上一个k*k,输方可以乘上一个k,k的值每一轮都可以不同,然后给你一个n和m,代表很多轮之后他们的得分,问这个得分是否合法

题目思路:很容易可以想到每一轮得分乘积的贡献都是一个k* k k,那么很多轮后就是,k1 k1 * k1 * k2 * k2 k2 … * kn * kn * kn,也就是说实际上是(k1 * k2 * … * kn) 的三次方,也就是说最终n *m的值一定为一个整数的三次方,然后看一下n和m的范围是1e9,也就是这个整数不会大于1e6,那么我们可以考虑二分去求解是否存在这样的一个值满足条件,有就Yes,否则就No就好了

#include <map>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;
typedef long long ll;
const int maxn = 1e6+10;

ll sum,n,m;
int t;

int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld",&n,&m);
        sum = n*m;
        ll l = 0ll,r = (ll)maxn;
        ll mid,ans;
        while(l <= r){
            mid = l+r>>1;
            if(mid*mid*mid >= sum) ans = mid,r = mid-1;
            else l = mid+1;
        }
        if(ans*ans*ans == sum&&n%ans == 0&&m%ans == 0) puts("Yes");
        else puts("No");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值