洛谷 2018 七月月赛 T1

T1

好长时间了终于开始写这一篇博客
做这道题时完全是懵逼的,一开始没有想到可以只剩下 1 ,直接判断了个数。。。看了题解明白了之后怎么改都改不对。。。突然奇思妙想或许这道题可以用位运算做???觉得分析已经没有错误了啊,为什么还是错????好吧~_~我傻逼竟然把2当成了非质数。。。哎。。。

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const int MAXN=1e5+1;
ll a[MAXN],b[MAXN];
inline ll readll()
{
    ll f=1,x=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return f*x; 
}
bool is_prime(ll x)
{
    if(x==2)return true;
    if(!(x%2))return false; 
    ll m=sqrt(x+0.5);
    for(ll i=3;i<=m;i+=2)if(!(x%i))return false;
    return true;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i=0;i<n;i++)a[i]=readll();
        for(int i=0;i<m;i++)b[i]=readll();
        ll x=0,cnt1=0,cnt2=0;
        for(int i=0;i<n;i++){
            x ^= a[i];
            if(a[i]==1)cnt1++;
        }
        for(int i=0;i<m;i++)
        {
            if(b[i]==1)cnt2++;
            x ^= b[i];
        }
        if((n-cnt1)-(m-cnt2)>=2){
            printf("NO\n");
            continue;
        }
        ll cnt=cnt1+cnt2;
        if(cnt%2)x ^= 1;
        if(x==0 || x==1 || !is_prime(x))printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhinv/p/9328327.html
今日推荐