求不相交集合並卷積
sol:
集合並卷積?看我 fwt!
交一發,10 以上的全 t 了
rep(s, 0, maxstate) rep(i, 0, n) rep(j, 0, n - i) h[i + j][s] = inc(h[i + j][s], mul(f[i][s], g[j][s]));把它改成
rep(i, 0, n) rep(j, 0, n - i) rep(s, 0, maxstate) h[i + j][s] = inc(h[i + j][s], mul(f[i][s], g[j][s]));就過了...
有理有據地分析一波,上面那種寫法會訪問 $o(2^n)$ 次不連續的空間,下面那種寫法只有 $o(n)$ 次
寫出來主要還是提醒自己以後陣列訪問盡量連續吧...
orz
#include #define ll long longview code#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using
namespace
std;
namespace
io return (hd==tl)?eof:*hd++;}
void flush()
void putchar(char c)
void write(int
x) if(x<0) x=-x,putchar('-'
);
while(x) ss[++top]=x%10,x/=10
;
while(top) putchar(ss[top]+'
0'),--top;
}intread()
}using
namespace
io;const
int mod = 1e9 + 9, maxn = (1
<< 21
);int
n;int f[21][maxn], g[21][maxn], h[21
][maxn], bt[maxn];
inline
int inc(int x, int
y) inline
int dec(int x, int
y) inline
int mul(int x, int y)
void fwt(int *a, int n, int
f) }
}}int
main()
LOJ 152 子集卷積
終於 get 到了子集卷積的正確姿勢,以前竟然都是用異或卷積寫的.眾所周知,異或卷積由於涉及到乘法所以會比較慢,那我們用或卷積就好了!code include define n 1 21 define ll long long define mod 1000000009 define lowbit ...
loj2340 FWT 子集卷積 州區劃分
description 傳送門 題解 看懂題需要一會 樸素的dp就可以列出乙個方程 f m ask 1r i p j k mask f j r k p f mask frac sum f j r k p f mask r i p1 j k mas k f j r k p其中r i r i r i 表...
luogu P6097 子集卷積 FST FWT
link 子集卷積 學了1h多 終於看懂是怎麼回事了 題解寫的不太清楚 翻了好幾篇部落格才懂 乙個需要用到的性質 二進位制位為1個數是i的二進位制數s 任意兩個沒有子集關係。挺顯然。而fst就是利用這個性質靠fwt做的。直接說做法 定義 f 表示 s 為i狀態為s的值.對於另乙個g陣列也同時定義。設...