C1001 游戏题解
题目描述
觉得太无聊了,于是决定和蒟蒻 玩游戏!
他们会玩 轮游戏,每轮游戏中有若干局,他们的初始积分为 ,每局的分值为 ,输的人的得分乘 ,赢的人得分乘 。每轮游戏后, 都会询问这次游戏双方的得分,但 记不住得分只能随口说两个得分。但他不知道这两个数最终会不会成为两个人的得分。于是 决定向你求助!
输入格式
第一行一个正整数 ,表示游戏轮数。
接下来 行,每行两个数 ,表示 随口说出的两个人的得分。
输出格式
行,每行一个“”或“”。表示这两个数是否合法。
对于每个 ,根据题意,要么在 中出现 次、 中两次,要么反之。
那么我们可以把 和 乘起来。记 ,则如果答案为 ,则 必定可以开立方,因为无论 在 还是 中的出现次数如何,乘起来一定是 次。
于是我们证明了 可以开立方是答案为 的必要条件。但不是充分条件,比如 ,显然不满足题目要求,但是满足 。于是特判掉 只在 或 中出现的情况就行。
目前是最优解
#include <cstdio>
#include <cmath>
#define INF 0x7fffffff
#define MAXN 100005
#define eps 1e-9
#define LL long long
#define LXF int
#define RIN read_32()
#define HH printf("\n")
#define GC (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)
using namespace std;
char buf[1<<20],*p1,*p2;
inline int read_32(){int X=0,w=0; char ch=0;while(ch<'0'||ch>'9') {w|=ch=='-';ch=GC;}while(ch>='0'&&ch<='9') X=(X<<3)+(X<<1)+(ch^48),ch=GC;return w?-X:X;}//read_32读int
int T;
int main(){
T=RIN;
while(T--){
int x=RIN,y=RIN;
int lf=pow((LL)x*(LL)y,0.333333333333334);
if((LL)lf*(LL)lf*(LL)lf==(LL)x*(LL)y && x%lf==0 && y%lf==0){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步