CF833A The Meaningless Game 思维

题目

Slastyona和她的忠实狗狗普什克正在玩一个毫无意义但是很有趣的游戏。游戏包括多个回合。

它的规则非常简单:先选择一个自然数k。然后,谁说(或吠)的比另一个快就会赢得一局。胜利者的得分在那之后会乘以k的平方,而输了的人的得分就只能乘以k。比赛开始时,Slastyona和PurSok都有一个初始分数。不幸的是,Slastyona丢失了记事本,那里记录了他们玩过的N个游戏的历史。她设法回忆了每一场比赛的最终结果,但是记忆都很模糊。帮助Slastyona验证它们的正确性,或者,换句话说,对于每一对给定的分数,确定游戏是否能够完成这样的结果。

输入输出样例

输入 #1

6
2 4
75 45
8 8
16 16
247 994
1000000000 1000000

输出 #1

Yes
Yes
Yes
No
No
Yes

题意

​ 现在两个人做游戏,每个人刚开始都是数字1,谁赢了就能乘以k^2,输的乘以k,现在给你最终这两个人的得分a,b,让你判断是否有这个可能,有可能的话Yes,否则No。

分析

由于每次都是一个数乘k,一个数乘$k2$,那么**每次这两个数都乘$k3$**,如果可以满足条件,那么给出的个数的乘积一定是一个整数的三次方

由于c++没有开立方的函数,我们可以用pow(x, $\frac{1}{3}$)来表示x的立方根。

由于pow返回的是double类型,如果判断x的立方根是否是整数会有精度损失,所以可以将x的立方根四舍五入后再乘以它的立方判断是否等于x。

同时还需要判断x的立方根是否是a,b的因数。、

代码

/*************************************************************************
	> File Name: v.cpp
	> Author: LiuGeXian
	> Mail: [email protected] 
	> Created Time: 2020/4/22 11:01:25
 ************************************************************************/

#include <bits/stdc++.h>
using namespace std;
int T;
int main(){
	scanf("%d", &T);
	while (T--){
		long long a, b;
		scanf("%lld %lld", &a, &b);
		long long x = a * b;
		long long y = pow(x, 1 / 3.0) + 0.5;
		if (y * y * y != x || a % y || b % y) printf("No\n");
		else printf("Yes\n");
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/ghosh/p/12751134.html