ZCMU - 1951: ly和wjw的无聊游戏

题目链接:点击打开链接

题目大意:略。

解题思路:我们考虑将 a 和 b 合起来考虑:
a*b=k1^3*k2^3*k3^3*...kn^3=(k1*k2*...kn)^3
所以 a*b 可以表示为某个数的三次方,但是这只是一个必要条件,显然我们还需要考虑对任意 ki,a 和 b 的因子都都有它,因为赢的人乘 ki^2,输的的人乘 ki,也就是幂次比为 1:2 或 2:1,不能存在 0:3 的情况
这时候我们可以发现,若将a进行平方操作,
那么本来 a 胜的回合,ki 的幂次变为 4,ki^4,a 败的回合 ki 的幂次变为 2,ki^2
这时候我们可以发现对应的 b,若 a 胜,ki^1,若 a 败,ki^2,我们可以发现就呈倍数,可以直接判断 a*a%b==0
反过来也一样,需要满足 b*b%a==0
总结一下满足条件的答案 a,b 则需要满足
1、a*a%b==0
2、b*b%a==0
3、存在 x 使得 a*b=x^3
所以二分搜一下 x 是否存在就行了。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

int jde(ll x)
{
    ll l=0,r=1000000,m;
    while(l<=r)
    {
        m=l+((r-l)>>1);
        if(m*m*m==x) return 1;
        else if(m*m*m<x) l=m+1;
        else r=m-1;
    }

    return 0;
}

int main()
{
    int T; scanf("%d",&T);
    ll a,b;
    while(T-- && ~scanf("%lld%lld",&a,&b))
    {
        if(a*a%b==0&&b*b%a==0&&jde(a*b)) puts("Ok");
        else puts("Error");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/81148118