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;
}