1. 程式人生 > >luoguP4491&&bzoj5306[HAOI2018]染色 NTT 容斥原理 組合數學

luoguP4491&&bzoj5306[HAOI2018]染色 NTT 容斥原理 組合數學

[HAOI2018]染色

題目傳送門
luogu
bzoj

分析

一個神奇的容斥。
題目中的恰好提示我們要把它轉化成至少
f [ i ] f[i] 表示出現至少 i

i 種出現次數為 S S 的顏色的方案數。
首先欽定 C m i
C_m^i
個顏色。
其次欽定 C n i S C_n^{iS}
個位置。
把他們全排列(可重集的排列) i S ! ( S ! ) i \frac{iS!}{(S!)^i}
剩下 m i m-i 種顏色, n i S n-iS 個位置,可以瞎放 ( m i ) n i S (m-i)^{n-iS}
於是
f [ i ] = C m i C n i S i S ! ( S ! ) i ( m i ) n i S f[i]=C_m^iC_n^{iS}\frac{iS!}{(S!)^i}(m-i)^{n-iS}
注意我們只需要處理出 l i m = m i n ( n S , m ) lim=min(\frac{n}{S},m) f f
求出這個玩意兒可以通過線性處理階乘和階乘逆元做到 O ( l i m l o g ) O(limlog) 搞出來
剩下根據容斥原理。
A n s [ k ] = i = k ( 1 ) i k C i k f [ i ] Ans[k]=\sum_{i=k}(-1)^{i-k}C_i^kf[i]
那個 C i k C_i^k 是因為從每個 f i f_i 都被 f k f_k 重複計算了 C i k C_i^k 次。
接下來就是套路了。
A n s [ k ] = i = k ( 1 ) i k i ! k ! ( i k ) ! f [ i ] Ans[k]=\sum_{i=k}(-1)^{i-k}\frac{i!}{k!(i-k)!}f[i]
A n s [ k ] k ! = i = k ( 1 ) i k ( i k ) ! f [ i ] i ! Ans[k]\cdot k!=\sum_{i=k}\frac{(-1)^{i-k}}{(i-k)!}f[i]i!
N T T NTT 即可。

程式碼

#include<bits/stdc++.h>
const int N = 262144, M = 1e7 + 10, P = 1004535809;
int ri() {
    char c = getchar(); int x = 0, f = 1; for(;c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
    for(;c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) - '0' + c; return x * f;
}
int w[N], R[N], A[N], B[N], sz[N], f[M], g[M], v[N], tp, L, InvL, n;
int fix(int x) {return (x >> 31 & P) + x;}
int add(int a, int b) {return a += b, a >= P ? a - P : a;}
int mul(int a, int b) {return 1LL * a * b % P;}
int Pow(int x, int k) {
    int r = 1;
    for(;k; x = mul(x, x), k >>= 1)
        if(k & 1)
            r = mul(r, x);
    return r;
}
int Inv(int x) {return Pow(x, P - 2);}
void Pre(int m) {
    L = 1; int x = 0;
    for(;(L <<= 1) < m; ++x) ;
    for(int i = 1;i < L; ++i)
        R[i] = R[i >> 1] >> 1 | (i & 1) << x;
    w[0] = 1; int wn = Pow(3, (P - 1) / L);
    for(int i = 1;i < L; ++i)
        w[i] = mul(w[i - 1], wn);
    InvL = Inv(L);
}
void DFT(int *F) {
    for(int i = 0;i < L; ++i)
        if(i < R[i])
            std::swap(F[i], F[R[i]]);
    for(int i = 1, d = L >> 1; i < L; i <<= 1, d >>= 1)
        for(int j = 0;j < L; j += i << 1) {
            int *l = F + j, *r = F + j + i, *p = w, tp;
            for(int k = i; k--; ++l, ++r, p += d)
                tp = mul(*r, *p), *r = fix(*l - tp), *l = add(*l, tp);
        }
}
int C(int m, int n) {return mul(mul(f[m], g[n]), g[m - n]);}
void Get(int n) {
    f[0] = 1; for(int i = 1;i <= n; ++i) f[i] = mul(f[i - 1], i);
    g[n] = Inv
            
           

相關推薦

luoguP4491&amp;&amp;bzoj5306[HAOI2018]染色 NTT 原理 組合數學

[HAOI2018]染色 題目傳送門 luogu bzoj 分析 一個神奇的容斥。 題目中的恰好提示我們要把它轉化成至少 設 f [

bzoj 4517: [Sdoi2016]排列計數【原理+組合數學

沒有 原理 getchar() display del d+ getchar esp const 第一個一眼就A的容斥題! 這個顯然是容斥的經典問題------錯排,首先考慮沒有固定的情況,設\( D_n \)為\( n \)個數字的錯排方案數。 \[ D_n=n!-\su

BZOJ4710 JSOI2011分特產(原理+組合數學

  顯然可以容斥去掉每人都不為空的限制。每種物品分配方式獨立,各自算一個可重組合乘起來即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include&

BZOJ4559 JLOI2016成績比較(原理+組合數學+斯特林數)

  容斥一發改為計算至少碾壓k人的情況數量,這樣對於每門課就可以分開考慮再相乘了。剩下的問題是給出某人的排名和分數的值域,求方案數。枚舉出現了幾種不同的分數,再列舉被給出的人的分數排第幾,算一個類似斯特林數的東西即可。後一部分與碾壓幾人是無關的,預處理一下,複雜度即為三方。當然和四方跑得也差不多快。   資

[BZOJ4710][Jsoi2011]分特產(原理+組合數學

題目描述 傳送門 題解 這道題的限制其實挺不明顯的,應該是“每個人都至少有一個” 也就是說對於所有的物品,將其劃分成n部分,每部分不能為空,問總的方案數 可以如果利用插板法的話,把n個相同的小

UVALive 7040 Color (原理 + 組合數學遞推公式 + 求逆元 + 基礎數論)

傳送門 英文題目: Recently, Mr. Big recieved n owers from his fans. He wants to recolor those owers with m colors. The owers are put in

[BZOJ2839]集合計數(原理+組合數學

題目描述 傳送門 題解 首先考慮固定k個元素,方案為Ckn 還剩下2n−k個集合,可以任選若干個集合C12n−k+C22n−k+..+C2n−k2n−k=22n−k 但是這樣選出來的有可能有不

LibreOJ #2541.「PKUWC 2018」獵人殺 分治NTT+原理

題意 獵人殺是一款風靡一時的遊戲“狼人殺”的民間版本,他的規則是這樣的: 一開始有nn個獵人,第ii個獵人有仇恨度wiwi,每個獵人只有一個固定的技能:死亡後必須開一槍,且被射中的人也會死亡。 然而向誰開槍也是有講究的,假設當前還活著的獵人有[i1...i

HDU 4390 Number Sequence (原理+組合計數)

osi freopen ret dsm algo .cn iterator push_back man HDU 4390 題意: 大概就是這樣。不翻譯了:

【BZOJ3294】放棋子(動態規劃,組合數學

ref efi amp 顏色 直接 using .org bzoj mat 【BZOJ3294】放棋子(動態規劃,容斥,組合數學) 題面 BZOJ 洛谷 題解 如果某一行某一列被某一種顏色給占了,那麽在考慮其他行的時候可以直接把這些行和這些列給丟掉。 那麽我們就可以寫出一個

【BZOJ 3027】 3027: [Ceoi2004]Sweet (原理+組合計數)

3027: [Ceoi2004]Sweet Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 34 Description John得到了n罐糖果。不同的糖果罐,糖果的種類不同(即同一個糖果罐裡的糖果種類是相同的,不同的糖果罐裡的糖果的種

HDU 6314 2018HDU多校賽第二場 Matrix(原理+組合計數)

Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 332768/332768 K (Java/Others) Total Submission(s): 445    Accepted Submiss

[BZOJ5306][HAOI2018]染色(+FFT)

urn can blank lld ons out bool main define https://www.cnblogs.com/zhoushuyu/p/9138251.html 註意如果一開始F(i)中內層式子中j枚舉的是除前i種顏色之外還有幾種出現S次的顏色,那麽

BZOJ_2393_Cirno的完美算數教室&amp;&amp;BZOJ_1853_[Scoi2010]幸運數字 _深搜+原理

代碼 優化 幸運 mes esp amp 如果 algorithm algo BZOJ_2393_Cirno的完美算數教室&&BZOJ_1853_[Scoi2010]幸運數字 _深搜+容斥原理 題意: ~Cirno發現了一種baka數,這種數呢~只含有2

HDU 4135——Co-prime(原理&amp;&amp;二進位制列舉)

題目連結: 模板 void prime(ll n) { k=0; for(int i=2;i*i<=n;i++) { if(n%i==0) { Prime[k++]=i; while

【bzoj3456】城市規劃 原理+NTT+多項式求逆

方案 所在 scanf 整理 輸入 eof 輸出 std define 題目描述 求出n個點的簡單(無重邊無自環)無向連通圖數目mod 1004535809(479 * 2 ^ 21 + 1). 輸入 僅一行一個整數n(<=130000) 輸出 僅一行一個整

[BZOJ4487][JSOI2015]染色問題()

一開始寫了7個DP方程,然後意識到這種DP應該都會有一個通式。 三個條件:有色行數為n,有色列數為m,顏色數p,三維容斥原理仍然成立。 於是就是求:$\sum_{i=0}^{n}\sum_{j=0}^{m}\sum_{k=0}^{p}(-1)^{n+m+p-i-j-k}\times C_n^i\times

POJ 1091 原理

.org 質因子 blank dfs tar cin href strong 元組 鏈接: http://poj.org/problem?id=1091 題意: 給你兩個正整數n,m,讓你求長度為n+1的滿足條件的一個等式:a[1]*x1+a[2]*x2+a[3]*x

原理

clu images class 又是 對象 title href 推理 計算 容斥原理(Inclusion–exclusion principle),是指在計數時,必須註意無一重復,無一遺漏,為了使重疊部分不被重復計算,人們研究出一種新的計數方法。這種方法的基

POJ 2773 原理

for log cto tor ans 個數 ret num void 鏈接: http://www.cnblogs.com/MashiroSky/p/5913989.html 題意: 給出兩個數m,k,要求求出從1開始與m互質的第k個數。 題解: 二分一個答案m