C1001 游戏题解

题目描述

everlasting 觉得太无聊了,于是决定和蒟蒻 yyc 玩游戏!

他们会玩 T 轮游戏,每轮游戏中有若干局,他们的初始积分为 1,每局的分值为 k,输的人的得分乘 k,赢的人得分乘 k2。每轮游戏后,everlasting 都会询问这次游戏双方的得分,但 yyc 记不住得分只能随口说两个得分。但他不知道这两个数最终会不会成为两个人的得分。于是 yyc 决定向你求助!

输入格式

第一行一个正整数 T,表示游戏轮数。

接下来 T 行,每行两个数 x,y,表示 yyc 随口说出的两个人的得分。

输出格式

T 行,每行一个“Yes”或“No”。表示这两个数是否合法。


对于每个 k,根据题意,要么在 x 中出现 1 次、y 中两次,要么反之。

那么我们可以把 xy 乘起来。记 M=x×y,则如果答案为 Yes,则 M 必定可以开立方,因为无论 kx 还是 y 中的出现次数如何,乘起来一定是 3 次。

于是我们证明了 M 可以开立方是答案为 Yes 的必要条件。但不是充分条件,比如 x=1,y=8,显然不满足题目要求,但是满足 1×8=23。于是特判掉 k 只在 xy 中出现的情况就行。

目前是最优解

#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;
}
posted @   Cap1taL  阅读(30)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示