这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了..
首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好。
然后发现有个重要的事情是后面每个质因子\(x\)做统计的时候都是独立的,那么单独做就好了
显然要压两个人的前面质因子集合\(f_{i,j}\)代表两个人分别是\(i,j\)集合的答案,然后一块一块的加后面的质因子就好
加每一块时,我们显然需要处理谁选择了这一块或者都没选,再搞个\(dp_{0/1,i,j}\)钦定一下谁选,随便转移一下就好了
Code:
#include#include #include #include template void read(T &x){ x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar();}const int N=510;const int pri[9]={0,2,3,5,7,11,13,17,19};int n,m,p,dp[2][1<<8][1<<8],f[1<<8][1<<8];inline int add(int a,int b){return a+b>=p?a+b-p:a+b;}inline int mul(int a,int b){return 1ll*a*b%p;}struct num{ int s,pri; bool friend operator <(num a,num b){return a.pri
2019.3.4