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
#include

#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

 

你可能感兴趣的:(#,ACM,#,ZCMU,#,数论)