一道思维题—— The Meaningless Game(裸模拟)

好的,先看一下题:

精简题意:

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

看起来没啥思路。

我一开始也是。

但是仔细一想一个人*k^2,一个人*k.

如果他俩乘一起,不就成了k^3。

so                                  __________________________________________________________-

下面是思路:

我们先计算a*b,那么考虑a*b=(k_1^3)(k_2^3)(k_i^3),即a*b为立方数的乘积组成,我们可以二分找出满足a*b=mid^3,我们判断mid是否等于k_1*k_2…*k_i。 
当且仅当存在a*b=mid^3,a%mid=0,b%mid=0,那么a,b就为他们最终的分数,反之不是。

是不是清晰明了。

然后就是代码了。

很简单,不建议直接copy。

加了一些注解。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 using namespace std;
 5 #define ll long long//long long 是必须的。 
 6 #define longdie return//专利保护权 
 7 #define hzoi 0
 8 int main(){
 9     //freopen("a.in","r",stdin);
10     int t;scanf("%d",&t);
11     while(t--){
12         ll a,b;scanf("%lld%lld",&a,&b);
13         ll c=0;
14         c=round((double)pow(a*b,1.0/3));//round 是四舍五入函数。cmath头文件 
15         if(c*c*c==a*b&&a%c==0&&b%c==0){
16             printf("yes\n");
17         }
18         else printf("no\n");
19     }
20     longdie hzoi;
21 } 

OK,本题就解决了

猜你喜欢

转载自www.cnblogs.com/DZN2004/p/12747143.html