WA求助帖
查看原帖
WA求助帖
911013
songge888楼主2024/7/31 23:14

第二个点过不去

Code:

#include <bits/stdc++.h>
#define ll long long
#define N 32623
using namespace std;
bool flag=false;
int n,t,y[N];//y是个桶,存小于sqrt(n)的质因数,y[i]代表第i个质数出现在了某个数的质因子中
int p[N],isp[N];//用来筛质数
map<int,int> m;//大于sqrt(n)的质因数扔到m里面
ll cnt=0;
void pm()//欧拉筛预处理质数
{
    for(ll i=2;i<N;i++)
    {
        if(!isp[i]) p[++cnt]=i;
        for(int j=1;j<=cnt&&i*p[j]<N;j++)
        {
            isp[i*p[j]]=1;
            if(!(i%p[j])) break;
        }
    }
}
signed main()
{
    pm();
    scanf("%d",&t);
    while(t--)
    {
        m.clear();//多测不清空 也要见祖宗
        memset(y,0,sizeof(y));
        flag=false;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
        	int x;    
            scanf("%d",&x);
            for(int j=1;j<=cnt&&x>=p[j];j++)//一个一个过p[N]
            {
                if(!(x%p[j])) 
                {
                    y[j]++;
                    while(!(x%p[j])) x/=p[j];//除干净
                }
            }
            if(x>1)//剩下的肯定是大于sqrt(n)的质因子
            {
                if(m[x]) 
                {
                    flag=true;
                    break;
                }
                m[x]=1;
            }
        }
        for(int i=1;i<=cnt;i++)//出现两次,说明有不互质
        {
            if(y[i]>=2) 
            {
                flag=true;
                break;
            }
        }
        if(flag) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
2024/7/31 23:14
加载中...