Hard Nim,bzoj4589,快速幂+FWT

正题

      给出n和m,要求选出n个在[1,m]中的质数,使得其异或和为0的方案数。

      首先我们先处理出来1到m的质数,并建立一个类似于bool数组来记录i是否为质数。

      接着,让这个长得像bool数组的数组求n次沃尔什变换,输出数组的第0位就可以了。

      因为数位就相当于他的值,而数位上的数相当于方案数,做一次沃尔什变换相当于加多一个数。

      我们看到n很到,毫不犹豫就想到了用快速幂加速。

      发现还是不能过?

      其实,只需要在最开始和最后面做变换就可以了,因为沃尔什变换中的tf数组可以连乘之后再求逆。

      所以这就大大降低了时间复杂度。

#include
#include
#include
#include
using namespace std;

const int maxm=65536;
int p[maxm+10];
long long prim[maxm+10],tot[maxm+10];
const long long mod=1e9+7,inv=5*1e8+4;
bool vis[maxm+10];
int n,m,limit,temp;

void tf_xor(long long *now){
	long long a,b;
	for(int l=2;l<=limit;l*=2)
		for(int i=0;i

 

你可能感兴趣的:(Hard Nim,bzoj4589,快速幂+FWT)