日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CF1516E. Baby Ehab Plays with Permutations(组合数学)

發(fā)布時(shí)間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF1516E. Baby Ehab Plays with Permutations(组合数学) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CF1516E. Baby Ehab Plays with Permutations

Solution

因?yàn)榻M合水平不行所以只弄出來(lái)一個(gè)O(k4)O(k^4)O(k4)的做法(雖然隨便改改可能就O(k3log?k)O(k^3\log k)O(k3logk)或者O(k3)O(k^3)O(k3)了)而且因?yàn)闆](méi)想清楚而自閉了很久,從而導(dǎo)致摸yu時(shí)間被閹割。

首先大概有個(gè)顯然的性質(zhì):設(shè)一個(gè)任意的操作方案形成的最終序列為a1,a2...ana_1,a_2...a_na1?,a2?...an?,把iiiaia_iai?連邊,會(huì)形成若干個(gè)環(huán),有個(gè)顯然的結(jié)論是到達(dá)該狀態(tài)的最少操作次數(shù)是所有環(huán)長(zhǎng)度減一的和,而一個(gè)任意方案可以表示為最少操作方案加上若干無(wú)用操作,顯然無(wú)用操作個(gè)數(shù)為偶數(shù)(由逆序?qū)€(gè)數(shù)奇偶性可得),因此我們只需要計(jì)算最少iii步能到達(dá)的狀態(tài)個(gè)數(shù)AnsiAns_iAnsi?,再讓Ansi′=∑k=0?i2?Ansi?2kAns'_i=\sum_{k=0}^{\lfloor\frac{i}{2}\rfloor}Ans_{i-2k}Ansi?=k=0?2i???Ansi?2k?即為最終的答案。

因此我們要對(duì)每一個(gè)iii,求出最少iii步能到達(dá)的狀態(tài)個(gè)數(shù)。

這就相當(dāng)于取若干個(gè)環(huán),使得所有環(huán)的長(zhǎng)度減一的和為iii,也就類(lèi)似于做一個(gè)完全背包,取jjj個(gè)數(shù)形成環(huán)的方案數(shù)就是環(huán)排列個(gè)數(shù)(j?1)!(j-1)!(j?1)!,因此枚舉枚舉環(huán)長(zhǎng)iii,枚舉該種環(huán)的個(gè)數(shù)ppp,再枚舉環(huán)包含的點(diǎn)數(shù)jjj和操作次數(shù)kkk,可得:
fj,k=∑pfj?ip,k?(i?1)p(i?1)p(jip)∏t=0p?1(ip?it?1i?1)f_{j,k}=\sum_{p}f_{j-ip,k-(i-1)p} (i-1)^p\binom{j}{ip}\prod_{t=0}^{p-1}\binom{ip-it-1}{i-1} fj,k?=p?fj?ip,k?(i?1)p?(i?1)p(ipj?)t=0p?1?(i?1ip?it?1?)

Ansi=∑jfj,i(nj)Ans_{i} = \sum_{j} f_{j,i}\binom{n}{j} Ansi?=j?fj,i?(jn?)

預(yù)處理一些東西即可計(jì)算。

Code

int fac[405], Inv[405], C[405][405], f[405][205], Ans[405], tmp[405][205], inv[405], Mul[405]; int quick_pow(int x, int y) {int ret = 1;for (; y ; y >>= 1) {if (y & 1) ret = 1ll * ret * x % mods;x = 1ll * x * x % mods;}return ret; } signed main() { #ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin); #endifint n, k;read(n), read(k);fac[0] = inv[0] = Inv[0] = 1;for (int i = 1; i <= k + k ; ++ i) Inv[i] = quick_pow(i, mods - 2);for (int i = 1; i <= k + k ; ++ i) fac[i] = 1ll * fac[i - 1] * i % mods, inv[i] = quick_pow(fac[i], mods - 2);for (int i = 0; i <= k + k ; ++ i) C[i][i] = C[i][0] = 1;for (int i = 1; i <= k + k ; ++ i)for (int j = 1; j < i ; ++ j) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mods;f[0][0] = 1;for (int i = 2; i <= min(n, k + 1) ; ++ i) {for (int j = 0; j <= k + k ; ++ j)for (int t = 0; t <= k ; ++ t) tmp[j][t] = f[j][t], f[j][t] = 0;for (int j = 0; j <= k + k ; ++ j) Mul[j] = 1;for (int p = 0, mul = 1; p <= k ; ++ p) {for (int j = i * p ; j <= k + k ; ++ j) {for (int t = (i - 1) * p ; t <= k ; ++ t)f[j][t] = (f[j][t] + 1ll * tmp[j - i * p][t - (i - 1) * p] * Mul[i * p] % mods * mul % mods * C[j][i * p] % mods) % mods;} for (int j = k + k; j >= 0 ; -- j)if (j >= i) Mul[j] = 1ll * Mul[j - i] * C[j - 1][i - 1] % mods;else Mul[j] = 0;mul = 1ll * mul * fac[i - 1] % mods;}}for (int i = 0, mul = 1; i <= min(k + k, n) ; ++ i) {for (int j = 0; j <= k ; ++ j) Ans[j] = (Ans[j] + 1ll * f[i][j] * mul % mods * inv[i] % mods) % mods;mul = 1ll * mul * (n - i) % mods;}for (int i = 2; i <= k ; ++ i) Ans[i] = (Ans[i] + Ans[i - 2]) % mods;for (int i = 1; i <= k ; ++ i) print(Ans[i]), putc(' ');return 0; }

總結(jié)

以上是生活随笔為你收集整理的CF1516E. Baby Ehab Plays with Permutations(组合数学)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。