洛谷P4491 HAOI2018 染色

2022-06-13 11:42:09 字數 1681 閱讀 3007

題面

題解:首先這個「恰好」看著很不爽,換成「至少」。

設\(f[i]\)表示顏色個數為\(s\)的顏色至少有\(i\)個的方案數。

考慮如何計算。

1.\(m\)個顏色選了\(i\)個,\(\binom\);

2.\(i\)個顏色選了恰好\(s\)個,其他的\(m-i\)個顏色任選;$$\frac ^i \times fac[n-i*s]} $$

3.剩下\(n-i*s\)個位置任選\(m-i\)中顏色,\(^\)。

把它們乘起來就是\(f[i]\)。

接下來考慮計算答案。

考慮容斥。設\(g[i]\)為顏色個數為\(s\)的顏色恰好有\(i\)個的方案數。於是有:

\[g[i]= \sum_^ \frac ^ } \times f[j] \times \binom

\]這個\(lim\)表示的是最多能取到的恰好有\(s\)個的顏色數,\(lim=min(n/s,m)\)。

將組合數拆開,試著把式子化為卷積的形式。

\[g[i] \times fac[i] = \sum_^ \frac ^ } \times f[j] \times fac[j]

\]這樣用ntt做就好了。

令$$a[i]=f[i] \times fac[i],b[i]= \frac ^ } $$

把\(b\)陣列翻轉一下,取做完卷積的陣列的\(lim\)到\(2lim\)位更新答案即可。

時間複雜度:\(o(n+mlogm)\)

**:

#includeusing namespace std;

#define re register int

#define f(x,y,z) for(re x=y;x<=z;x++)

#define for(x,y,z) for(re x=y;x>=z;x--)

typedef long long ll;

#define i inline void

#define in inline int

#define cl(x,y) memset(x,y,sizeof(x))

#define ktk system("pause")

templatei read(d &res)

while(isdigit(ch))

res*=g;

}const int mod=1004535809;

int n,m,k,s,len,lim,ans,r[303000],w[303000],fac[10100000],inv[10100000],f[303000],a[303000],b[303000];

i add(int &x,int y)

in plus(int x,int y)

in pow(int x,int y)

return res;

}in c(int x,int y)

i init()

i ntt(int *a,int sn)

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

f(i,0,s-1)a[i]=(ll)a[i]*b[i]%mod;

ntt(a,-1);

f(i,lim,lim<<1)add(ans,(ll)a[i]*w[i-lim]%mod*inv[i-lim]%mod);

printf("%d",ans);

return 0;

}

題解 P4491 HAOI2018 染色

長度為 n 的序列,每個位置都可以被染成 m 種顏色中的某一種.如果恰 好出現了 s 次的顏色有 k 種,會產生 w k 的貢獻.對於所有可能的染色方案,他能獲得的愉悅度的和對 1004535809 取模的結果是多少.最多有 lim min m,frac 種顏色。記最少選 i 種的答案為 f i 有...

洛谷 P2517 HAOI2010 訂貨

給出每乙個月的商品需求量和每乙個月的生產成本以及倉庫容量和貯存費用 每月,與貯存貨物的量無關 問最小成本.一開始沒有想到用費用流去做,且難以建圖,但將名詞轉化一下即可 將貨物的量當做流量,成本當做費用,先建乙個超級源點 可以理解為工廠 連向每乙個月的節點,因為生產數量無限制,故流量為inf,費用為成...

洛谷P2018 訊息傳遞

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係 a是b的上級,b也是a的上級。最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...