zoukankan      html  css  js  c++  java
  • 【筛法求素数】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;
    }
  • 相关阅读:
    敌兵布阵
    Points on Cycle
    Hero
    E~最少拦截系统
    C
    A
    J
    H
    G
    A
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7261163.html
Copyright © 2011-2022 走看看