题目描述
\(everlasting\) 觉得太无聊了,于是决定和蒟蒻 \(yyc\) 玩游戏!
他们会玩 \(T\) 轮游戏,每轮游戏中有若干局,他们的初始积分为 \(1\),每局的分值为 \(k\),输的人的得分乘 \(k\),赢的人得分乘 \(k^2\)。每轮游戏后,\(everlasting\) 都会询问这次游戏双方的得分,但 \(yyc\) 记不住得分只能随口说两个得分。但他不知道这两个数最终会不会成为两个人的得分。于是 \(yyc\) 决定向你求助!
输入格式
第一行一个正整数 \(T\),表示游戏轮数。
接下来 \(T\) 行,每行两个数 \(x,y\),表示 \(yyc\) 随口说出的两个人的得分。
输出格式
\(T\) 行,每行一个“\(Yes\)”或“\(No\)”。表示这两个数是否合法。
对于每个 \(k\),根据题意,要么在 \(x\) 中出现 \(1\) 次、\(y\) 中两次,要么反之。
那么我们可以把 \(x\) 和 \(y\) 乘起来。记 \(M=x\times y\),则如果答案为 \(Yes\),则 \(M\) 必定可以开立方,因为无论 \(k\) 在 \(x\) 还是 \(y\) 中的出现次数如何,乘起来一定是 \(3\) 次。
于是我们证明了 \(M\) 可以开立方是答案为 \(Yes\) 的必要条件。但不是充分条件,比如 \(x=1,y=8\),显然不满足题目要求,但是满足 \(1\times 8=2^3\)。于是特判掉 \(k\) 只在 \(x\) 或 \(y\) 中出现的情况就行。\
#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;
}
标签:得分,ch,游戏,题解,yyc,Yes,C1001,define
From: https://www.cnblogs.com/Cap1taL/p/17141135.html