题意即,从所有小于\(m\)的质数中,选出\(n\)个数,使它们异或和为\(0\)的方案数。
令\(G(x)=[x是质数]\),其实就是对\(G(x)\)做\(n\)次异或卷积后得到多项式的第\(0\)项。 如果\(n\)很小,可以一次次的FWT。事实上在第一次FWT之后,直接快速幂就行了,不需要中间IFWT转回去。//1652kb 4352ms#include#include #include #include #define gc() getchar()#define inv2 500000004#define mod 1000000007#define Add(x,y) (x+y>=mod?x+y-mod:x+y)#define Sub(x,y) (x >2];inline int read(){ int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now;}void Init(int n){ not_P[1]=1; for(int i=2,cnt=0; i<=n; ++i) { if(!not_P[i]) P[++cnt]=i; for(int j=1; j<=cnt&&i*P[j]<=n; ++j) { not_P[i*P[j]]=1; if(!(i%P[j])) break; } }}void FWT(int *a,int lim,int opt){ for(int i=2; i<=lim; i<<=1) for(int j=0,mid=i>>1; j >=1) { if(k&1) for(int i=0; i