codeforces 834C The Meaningless Game(数学题)

传送门: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值