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,一个数乘\(k^2\),那么每次这两个数都乘\(k^3\),如果可以满足条件,那么给出的个数的乘积一定是一个整数的三次方

我不知道c++有没有开立方的函数,但是可以用pow(x, \(\frac{1}{3}\))来表示x的立方根。

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

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

代码

/*************************************************************************
    > File Name: v.cpp
    > Author: LiuGeXian
    > Mail: 1019630230@qq.com 
    > 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;
}

原文链接: https://www.cnblogs.com/ghosh/p/12751134.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    CF833A The Meaningless Game 思维

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/343844

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午2:19
下一篇 2023年3月2日 上午2:19

相关推荐