江西财经大学第一届程序设计竞赛 I 题 小P和小Q
题目链接:https://www.nowcoder.com/acm/contest/115/I
这题目要注意的是!!!pow函数前强制类型转换一定要float !!!一定要是float,double不可以,否则数据一大就会出错,cbrt函数也是这样!!!
解题思路:每回合的k都不一样,所以我们找找规律看看。假设最后 a 得到 x1 分,b 得到 x2 分。假设 a 赢了两局,b 赢了一局那么我们是不是可以将 x1拆分为 x1= k12*k22*k3, 则 x2=k1*k2*k3。
那么就有(x1*x2)1/3==n (n为正整数) 。
这道题还要特判一下,比如a 1分,b 8分。虽然开3次方为2,是正整数,但是却得不到。后台数据也没有卡这点。
AC代码:
1 #include<iostream>
2 #include<bits/stdc++.h>
3 using namespace std;
4 int main(){
5 int t;
6 cin>>t;
7 while(t--){
8 long long a,b;
9 cin>>a>>b;
10 long long c=a*b;
11 if(a==1&&b==1){
12 cout<<"Yes"<<endl;
13 }else if(a==1&&b!=1){
14 cout<<"No"<<endl;
15 }else if(a!=1&&b==1){
16 cout<<"No"<<endl;
17 }else{
18 long long ans=(float)pow(c,1.0/3.0); //float !!!一定要是float,double不可以,否则数据一大就会出错,cbrt函数也是这样!!!
19 long long va=ans*ans*ans;
20 if(va==c){
21 cout<<"Yes"<<endl;
22 }else{
23 cout<<"No"<<endl;
24 }
25 }
26 }
27 return 0;
28 }