题解 P4752 【Divided Prime】

Iowa_BattleShip

2018-07-16 20:07:54

Solution

**这是一个不需要$STL$的方法** 因为每个因子都很大,所以我们不可能直接乘起来再除~~(这不是废话)~~,而题目保证对于一个数字,其在$b_i$中出现的次数不多于在$a_i$中出现的次数,所以我们很容易想到要把$a$中的数用$b$里的约分掉,而众所周知,$a\land a=0$,于是我们就可以考虑利用**异或**来约分,主要细节看代码说吧。 ```cpp #include<cstdio> using namespace std; typedef long long ll; ll re()//快读 { ll x=0; char c=getchar(); bool p=0; for(;c<'0'||c>'9';c=getchar()) p=(c=='-'||p)?1:0; for(;c>='0'&&c<='9';c=getchar()) x=x*10+(c-'0'); return p?-x:x; } bool judge(ll x)//判断是否是质数 { int i; if(!x||x==1)//特判0和1 return false; for(i=2;1LL*i*i<=x;i++)//朴素根号n试除法判断 if(!(x%i)) return false; return true; } int main() { int i,n,m,t,s; ll x,y; t=re(); while(t--)//多组数据 { x=y=s=0;//初始化为0 n=re(); m=re(); for(i=1;i<=n+m;i++)//因为异或的性质,我们可以一次性读完并异或 { y=re(); if(y!=1)//注意!因为无论有多少个1,都是不影响结果的,所以在异或时要把1排除 { i>n?s--:s++;//显然(除去1后)只有当a里的数比b里的数多一个时才可能是质数,所以我们通过统计来判断 x^=y;//将所有数异或起来,如果满足上述“多一个”的条件,则异或完所剩下的必是没有被约分的数 } } if(s==1&&judge(x))//判断是否满足上述“多一个”的条件,且这个剩余的数是否质数 printf("YES\n"); else printf("NO\n"); } return 0; } ``` 另外,我用下面这个数据,将一个题解卡掉了 ```cpp 1 5 2 1 1 1 2 3 1 2 正确输出:YES ```