codeforce The Meaningless Game(二分+数学思维)

题目链接:codeforces.com/contest/834/problem/C

题目大意:两个人玩游戏,两个人的初始积分都为1,游戏有很多轮,每一轮赢得用积分*k^2,输的积分*k,最后的积分分别为a和b,你来判断最后的得分是否合理。

题目思路:思考之后就会发现积分的乘积为某个数的立方,所以通过二分的方法查找这个数,当然还要加别的判断条件,为了确保a,b中是满足题目要求的做法,所以加上a*a%b==0    b*b%a==0的判断条件

代码:

#include<cstdio>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
typedef long long ll;  
  
bool find(ll m)  
{  
    int l = 1,r = 1e6;//1e6的三次幂就是1e18,正好是1e9的平方  
    ll mid;  
    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(a*a%b == 0&&b*b%a == 0&&find(a*b))//前两个条件是很重要的,这样保证了每一次round,都是按照k^2和k,这样分的  
            printf("YES\n");             //能找到某个数的3次方等于a*b只是必要条件,还要加上上面一条才可以  
        else  
            printf("NO\n");  
    }  
      
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值