LOJ 3120 珍珠 容斥 生成函式 NTT

2022-05-08 01:27:09 字數 1838 閱讀 3074

求:有多少種序列滿足 $a[i] \subseteq [1,d]$ 且 $m \leqslant \sum_^ \frac$

裸做的話就是乙個揹包:$f[i][j]$ 表示前 $i$ 個數匹配了 $j$ 對的方案數,然後由於沒有匹配的肯定是單個出現,所以轉移的話比較容易.

再加上幾個點的特判,和不知道能不能過的矩陣乘法,大概能拿 72 分.

然後分析上面那個 $\sum_^ \frac$,由於這個是向下取整,所以乙個數出現次為奇數的話就會少一對貢獻.

那麼出現次數為奇數的個數就不超過 $n-2 \times m.$

不妨列舉出現次數為奇數的有多少個:

$f_=\binomn! (\frac})^i (\frac}) ^[x^n]$

但是這個式子不好推,因為前後有兩個 $\frac}$ 這樣的生成函式.

不妨考慮二項式反演,即欽定一些位置是奇數,然後其餘位置隨便填.

$\rightarrow f_=\binomn! (\frac})^i e^ [x^n]$

考慮對 $\frac}$ 用二項式定理,然後消掉後面的 $e^$

會得到 $f_=\fracn!} \sum_^ (-1)^j e^[x^n]$

根據 $e^x=\sum_^ \frac$,第 $n$ 項係數為 $\frac$

那麼就得到 $f_=\fracn!} \sum_^ (-1)^j \frac$

這個可以寫成卷積的形式,然後用 ntt 算就行,最後那個二項式反演也可以用 ntt 來加速.

在程式的開頭可以特判答案為 0 和答案為 $d^n$ 的情況.

時間複雜度為 $o(d \log d)$.

#include #include #include #include #define n 100009  

#define ll long long

#define mod 998244353

#define setio(s) freopen(s".in","r",stdin)

using namespace std;

int fac[n],inv[n],a[n<<2],b[n<<2],f[n],g[n],lw[n];

int add(int x,int y)

int dec(int x,int y)

int mul(int x,int y)

int qpow(int x,int y)

return tmp;

} int get_inv(int x)

void ntt(int *a,int len,int op)

for(int j=len>>1;(k^=j)>=1);

} for(int l=1;l=d)

init();

for(lim=1;lim<=(d<<1);lim<<=1);

for(int i=0;i<=d;++i)

ntt(a,lim,1),ntt(b,lim,1);

for(int i=0;intt(a,lim,-1);

for(int i=0;i<=d;++i)

for(int i=0;ifor(int i=0;i<=d;++i)

ntt(a,lim,1),ntt(b,lim,1);

for(int i=0;intt(a,lim,-1);

int ans=0;

for(int i=0;i<=n-2*m;++i)

printf("%d\n",ans);

return 0;

}

HCPL3120手冊翻譯

首先hcpl3120是乙個2.5a電流輸出的igbt門極驅動光電耦合器。description hcpl3120包含乙個磷砷化鎵的發光led,該led被光電耦合於乙個帶有功率輸出級的積體電路上。這些光耦合器適用於驅動應用在電機控制逆變器功率igbt和mosfet。輸出級的高工作電壓範圍提供開關管所需...

LOJ 皇宮看守

題目鏈結 點加權的最小覆蓋 題目說的很清楚,用最少的點覆蓋所有的點。題目給出的是個樹,所以可以用動態規劃來解決。給出如下定義 f i,0 表示i點不放,i可以被父親節點觀察到 f i,1 表示i點不放,i可以被兒子節點觀察到 f i,2 表示i點放,在i處設定警衛 轉移如下 1 由f i,0 定義可...

loj冪方分解

問題描述 任何乙個正整數都可以用2的冪次方表示。例如 137 27 23 20 同時約定方次用括號來表示,即ab 可表示為a b 由此可知,137可表示為 2 7 2 3 2 0 進一步 7 22 2 20 21用2表示 3 2 20 所以最後137可表示為 2 2 2 2 2 0 2 2 2 0 ...