【筛法求素数】Codeforces Round #426 (Div. 1) A. The Meaningless Game

先筛出来1000以内的素数。
枚举x^(1/3) 和 y^(1/3)以内的素因子,这样除完以后对于x和y剩下的因子,小的那个的平方必须等于大的。
然后判断每个素因数的次数之和是否为3的倍数,并且小的那个次数不小于大的次数的两倍。
当然这题是有O(1)的做法哒。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
bool vis[100010];
int pr[100010],e;
void Shai()
{
    vis[1]=true;
    for(long long i=2;i<=1000ll;i++){
    	if(!vis[i]){
    		pr[++e]=i;
    		for(long long j=i*i;j<=1000ll;j+=i){
    			vis[j]=true;
    		}
    	}
    }
}
int n,cnta[100010];
int main(){
	Shai();
	int x,y;
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&x,&y);
		int X=x;
		for(int j=1;j<=e;++j){
			if(X%pr[j]==0){
				while(X%pr[j]==0){
					X/=pr[j];
					++cnta[j];
				}
			}
		}
		bool lose=0;
		for(int j=1;j<=e;++j){
			int cntb=0;
			if(y%pr[j]==0){
				while(y%pr[j]==0){
					y/=pr[j];
					++cntb;
				}
			}
			if((cnta[j]+cntb)%3!=0){
				lose=1;
				break;
			}
			else if(min(cnta[j],cntb)*2<max(cnta[j],cntb)){
				lose=1;
				break;
			}
		}
		if(!(X==1 && y==1) && !((ll)min(X,y)*(ll)min(X,y)==(ll)max(X,y))){
			lose=1;
		}
		for(int j=1;j<=e;++j){
			cnta[j]=0;
		}
		if(!lose)
		puts("Yes");
		else
		puts("No");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/autsky-jadek/p/7261163.html