题意:
给出一颗带点权的树,输出有多少联通块的点权异或和=[1,m)
dp[x][i] 以x为根的子树中,联通块内一定有x,目前异或和为i 的联通块 个数
dp[x][i] = dp[x][i] + Σ Σ [j^k==i] dp[x][j]^dp[son][k]
时间复杂度为 n*m*m
用FWT优化到 n*m*logm
#include#include #include #include using namespace std;const int mod=1e9+7;#define N 1001const int M=(1<<10)+2;int m;int val[N];vector V[N];int dp[N][M],tmp[M];int ans[M];long long inv;void read(int &x){ x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }}void FWT_xor(int *a,int n){ int x,y; for(int d=1;d <<=1) for(int m=d<<1,i=0;i >=1,a=a*a%mod) if(b&1) res=res*a%mod; return res;}int main(){ int T; int n,u,v; read(T); inv=Pow(2,mod-2); while(T--) { memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); read(n); read(m); for(int i=1;i<=n;++i) read(val[i]); for(int i=1;i<=n;++i) V[i].clear(); for(int i=1;i