基于变换合并的树上动态 DP 的链分治算法 & SDOI2017 切树游戏(cut)解题报告
切了一晚树心态崩了。
你问我怎么求异或逆卷积。
我,我。我???我!!!!!才不会说是把FWT后的数组每个求个逆元呢。。。。。。。
怎么模数为质数还有没有逆元的操作啊!!!!!
对于10007的倍数没有逆元的情况,标程的方法是维护非0部分的积和0的个数,这样就可减了
-Claris
不然就要打用数据结构维护轻儿子的( t o p − t r e e ? top-tree? top−tree?)
AC Code:
#include<bits/stdc++.h>
#define maxn 30005
#define maxm 128
#define mod 10007
using namespace std;
int n,m;
int inv[mod]={
1,1};
int w[maxn],v[maxn][maxm],cg0[maxn][maxm],g[maxn][maxm],gu[maxn][maxm],val[maxm][maxm],ls[maxn][maxm],rs[maxn][maxm],su[maxn][maxm],sum[maxn][maxm];
int info[maxn],Prev[maxn<<1],to[maxn<<1],cnt_e=0;
void Node(int u,int v){
Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
void FWT(int *a,int tp){
static int c[2] = {
(mod+1)/2,1};
for(int L=2;L<=m;L<<=1)
for(int l=L>>1,st=0;st<m;st+=L)
for(int k=st;k<st+l;k++)
{
int x = a[k] , y = a[k+l];
a[k] = (x + y) * c[tp==1] % mod ,
a[k+l] = (x-y) * c[tp==1] % mod;
}
}
int siz[maxn],son[maxn],fa[maxn],ch[maxn][2]