题目链接:点击打开链接
题目大意:略。
解题思路:我们考虑将 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; }