传送门:codeforces 834C
题目大意:
两人进行比赛,初始分都为 1,每局选择一个自然数 k,胜者的得分乘以 k^2,败者的得分乘以 k,给出两人的最终得分,问这个得分是否有可能出现。
思路:
正确思路很简单,我主要是想说明一下我之前的思路是怎么错的。
正确思路是将两者的得分相乘,然后开三次方得 x,如果乘积是立方数并且两者的得分都是 x 的倍数,则这个分数有可能出现,反之,没可能。
我的错误思路是将两者的得分分别分解质因数,由于每一轮两者共乘以了 k^3,所以看看两者同一质因子的指数是否为 3 的倍数。由于 1000^3 = 1e9 ,所以理论上只求出 1000以内的质数就可以了。这种思路的错误在于当两者得分都是一个很大的质数时,1000以内质数的质数都是 0,会错判为有可能出现。
注意:
两数乘积大,要用 long long型,另外开三次方可以用 pow(n,1.0/3) 这个函数,不过结果要四舍五入,这个地方我不是很明白为什么要四舍五入,是因为 1.0/3 不精确吗,如果谁懂还请不吝赐教……
代码:
#include<stdio.h>
#include<math.h>
typedef long long LL;
int main()
{
int t,a,b;
LL n,x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
n=(LL)a*b;
x=pow(n,1.0/3)+0.5; //对乘积开三次方并四舍五入
//如果乘积是立方数并且两者得分都是 x 的倍数
if(x*x*x!=n||a%x!=0||b%x!=0) printf("No\n");
else printf("Yes\n");
}
return 0;
}