好的,先看一下题:
精简题意:
现在两个人做游戏,每个人刚开始都是数字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,本题就解决了