loj 161 子集卷積

2022-05-22 19:51:12 字數 1406 閱讀 7228

求不相交集合並卷積

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 long

#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()

view code

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陣列也同時定義。設...