求:有多少種序列滿足 $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 ...