32pts(WA on #4,#10-25)求条
查看原帖
32pts(WA on #4,#10-25)求条
1284081
haoran150楼主2025/7/25 10:19

个人认为分解质因数没有错误,讨论版的hack都过了

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int T,n,a[N];
#define LOCAL
namespace ly
{
    namespace IO
    {
        #ifndef LOCAL
            #define SIZE (1<<20)
            char in[SIZE],out[SIZE],*p1=in,*p2=in,*p3=out;
            #define getchar() (p1==p2&&(p2=(p1=in)+fread(in,1,SIZE,stdin),p1==p2)?EOF:*p1++)
            #define flush() (fwrite(p3=out,1,SIZE,stdout))
            #define putchar(ch) (p3==out+SIZE&&flush(),*p3++=(ch))
            class Flush{public:~Flush(){flush();}}_;
        #endif
        template<typename type>
        inline void read(type &x)
        {
            x=0;bool flag(0);char ch=getchar();
            while(!isdigit(ch)) flag^=ch=='-',ch=getchar();
            while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
            flag?x=-x:0;
        }
        template<typename type>
        inline void write(type x,bool flag=1)
        {
            x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);
            do Stack[++top]=x%10,x/=10;while(x);
            while(top) putchar(Stack[top--]|48);
            flag?putchar('\n'):putchar(' ');
        }
        #ifndef LOCAL
            #undef SIZE
            #undef getchar
            #undef putchar
            #undef flush
        #endif
    }
}using namespace ly::IO;
//快读模版,不用多管 
int prime[6000000],cnt=0;
int isprime[100001000];
bool vis[6000000];
void __init__(){
    memset(isprime,-1,sizeof(isprime)); 
    isprime[1] = false; 
    for(int i=2;i<=1e8;++i){
        if(isprime[i]){
        	prime[++cnt]=i;
        	isprime[i]=cnt;
		}
        for(int j = 1;j<=cnt&&i*prime[j]<=1e8;++j){
            isprime[i*prime[j]]=false;
            if(i%prime[j]==0) break;
        }
    }
    return ;
}
bool factor(int x){
//	printf("It comes to %d\n",x);
	if(isprime[x]){
//		printf("%d is a prime number\n",x);
		vis[isprime[x]]=true;
		return false;
	}
	for(int j=1;prime[j]*prime[j]<=x;j++){
		if(x%prime[j]) continue;
//		printf("%d can be divided by %d with no remainder\n",x,prime[j]);
		if(vis[j]){
			return true;
		}
		while(!(x%prime[j])){
			x/=prime[j];
		}
		vis[j]=true;
	}
	if(x==1) return false;
	if(vis[isprime[x]]) return true;
	vis[isprime[x]] = true;
	return false;
}
int main(){
	read(T);
	__init__();
//	for(int i=1;i<=10000100;i++){
//		printf("%d is %s prime;\n",i,(isprime[i]?"":"not"));
//	}
	while(T--){
		read(n);
		int gcd;
		memset(vis,0,sizeof vis);
		for(int i=1;i<=n;i++){
			read(a[i]);
			gcd=(i==1?a[i]:__gcd(a[i],gcd));
//			printf("Now gcd is %d\n",gcd);
		}
		if(n==2){
			printf("Yes");
			goto CON;//飞过去只为换个行 
		}
		if(gcd!=1){
			printf("No");
			goto CON;//飞过去只为换个行 
		}
		for(int i=1;i<=n;i++){
			if(factor(a[i])){
				printf("No");
				goto CON;//飞过去只为换个行 
			}
		}
		printf("Yes");
		CON:
		puts("");
	}
}

@meifan666

2025/7/25 10:19
加载中...