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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

莓良心(第二类斯特林数)

發布時間:2023/12/3 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 莓良心(第二类斯特林数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

莓良心

  • problem
  • solution
  • code

problem

莓在執行任務時,收集到了 nnn 份巖漿能源,其中第 iii 份的能量值是 wiw_iwi? ,她
決定將它們分成恰好 kkk 組帶回基地,每一組都要有至少 111 份能源。

每一組能源會對運輸設備產生負荷值,若該組有 xxx 份能源,這 xxx 份能源能
量值之和為 yyy , 則產生的負荷值為 x×yx × yx×y

每種分組方案產生的負荷是每一組能源產生的負荷值總和,莓想知道所有可
能的分組方案產生的負荷之和對 998244353 取模的結果 。

k≤n≤1e6k\le n\le 1e6kn1e6

solution

nnn 個不同物品分成 kkk 組,球有標號,盒子無標號,顯然是第二類斯特林數。

考場上倒是把公式都推出來了,但是沒反應過來是第二類斯特林。。。但這不重要,主要是沒想到優化計算方式。

暴力求第二類斯特林數:fi,j=fi?1,j?j+fi?1,j?1f_{i,j}=f_{i-1,j}*j+f_{i-1,j-1}fi,j?=fi?1,j??j+fi?1,j?1?

容斥求第二類斯特林數:∑i=0k(?1)i(ki)(k?i)nk!\frac{\sum_{i=0}^k(-1)^i\binom{k}{i}(k-i)^n}{k!}k!i=0k?(?1)i(ik?)(k?i)n?

考慮將每個數單獨拆開計算貢獻,暴力枚舉其所在組的個數,然后乘以剩下數分成 k?1k-1k?1 組的方案數,時間復雜度是 O(n2)O(n^2)O(n2) 的。

我就卡在這里優化不了了。

考慮若 u,vu,vu,v 分在一組,則對答案有 wu+wvw_u+w_vwu?+wv? 的貢獻,即 ans=∑u=1nwu?{nk}+∑u≠v(wu+wv)?{n?1k}ans=\sum_{u=1}^nw_u·\left\{\begin{matrix}n\\k\end{matrix}\right\}+\sum_{u\neq v}(w_u+w_v)·\left\{\begin{matrix}n-1\\k\end{matrix}\right\}ans=u=1n?wu??{nk?}+u?=v?(wu?+wv?)?{n?1k?}

?ans=∑wi?({nk}+(n?1){n?1k})\Rightarrow ans=\sum_{w_i}·\Bigg(\left\{\begin{matrix}n\\k\end{matrix}\right\}+(n-1)\left\{\begin{matrix}n-1\\k\end{matrix}\right\}\Bigg)?ans=wi???({nk?}+(n?1){n?1k?})

線性篩預處理 (k?i)n(k-i)^n(k?i)n,時間復雜度為 O(n)O(n)O(n)

code

#include <cstdio> #include <iostream> using namespace std; #define Pair pair < int, int > #define int long long #define mod 998244353 #define maxn 1000005 int n, k, cnt; int fac[maxn], inv[maxn], Pow1[maxn], Pow2[maxn], prime[maxn]; bool vis[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }void init() {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod; }void sieve() {Pow1[1] = Pow2[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) {prime[++ cnt] = i;Pow1[i] = qkpow( i, n );Pow2[i] = qkpow( i, n - 1 );}for( int j = 1;j <= cnt and i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;Pow1[i * prime[j]] = Pow1[i] * Pow1[prime[j]] % mod;Pow2[i * prime[j]] = Pow2[i] * Pow2[prime[j]] % mod;if( i % prime[j] == 0 ) break;}} }int C( int n, int m ) { return fac[n] * inv[m] % mod * inv[n - m] % mod; }Pair calc() {int ans1 = 0, ans2 = 0;for( int i = 0;i <= k;i ++ ) {int t = ( i & 1 ) ? -1 : 1;ans1 = ( ans1 + t * C( k, i ) * Pow1[k - i] % mod ) % mod;ans2 = ( ans2 + t * C( k, i ) * Pow2[k - i] % mod ) % mod;}ans1 = ans1 * inv[k] % mod;ans2 = ans2 * inv[k] % mod;return { ( ans1 + mod ) % mod, ( ans2 + mod ) % mod }; }signed main() {freopen( "ichigo.in", "r", stdin );freopen( "ichigo.out", "w", stdout );scanf( "%lld %lld", &n, &k );int sum = 0;for( int i = 1, w;i <= n;i ++ ) scanf( "%lld", &w ), sum = ( sum + w ) % mod;init();sieve();Pair ans = calc();printf( "%lld\n", ( ans.first + ( n - 1 ) * ans.second ) % mod * sum % mod );return 0; }

總結

以上是生活随笔為你收集整理的莓良心(第二类斯特林数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。