集合均值(逆元+数学)
生活随笔
收集整理的這篇文章主要介紹了
集合均值(逆元+数学)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
problem
題目描述
有兩個可重集合 nnn,初始時 mmm 只包含一個 000,是給定的。
執行以下操作:
求最后答案的期望。
輸入格式
第一行兩個整數 n,mn,mn,m,表示集合 BBB 可以分成 mmm 個大小為 nnn 的部分。
solution
考慮第一個被選擇的數 xxx 的貢獻,即 1n?m?(12+13+...+1n?m+1)?x\frac{1}{n*m}·(\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n*m+1})·xn?m1??(21?+31?+...+n?m+11?)?x 【從加入后每一輪都會產生一個貢獻】
發現系數具有連續性,第 iii 次加入的數的貢獻為 1n?m?(1i+1+1i+2+...+1n?m+1)?x\frac{1}{n*m}·(\frac{1}{i+1}+\frac{1}{i+2}+...+\frac{1}{n*m+1})·xn?m1??(i+11?+i+21?+...+n?m+11?)?x
考慮枚舉這個數是第幾次被加入的,統計答案即可。
相同權值的數的所有情況貢獻是完全相同的。
線性遞推逆元,并處理逆元的后綴和即可。
code
#include <cstdio> #define maxn 20000005 #define mod 998244353 int n, m; int inv[maxn];int main() {freopen( "mos.in", "r", stdin );freopen( "mos.out", "w", stdout );scanf( "%d %d", &n, &m );inv[1] = 1;for( int i = 2;i <= n * m + 1;i ++ ) inv[i] = ( - mod / i * 1ll * inv[mod % i] % mod + mod ) % mod;int p = 0, f = 0;for( int i = n * m + 1;i > 1;i -- ) {f = ( 1ll * f + inv[i] ) % mod;p = ( 1ll * p + f ) % mod;} int ans = 0;for( int i = 1, x;i <= n;i ++ ) {scanf( "%d", &x );ans = ( 1ll * ans + 1ll * p * x % mod * m ) % mod;}printf( "%d\n", 1ll * ans * inv[n * m] % mod ); }總結
以上是生活随笔為你收集整理的集合均值(逆元+数学)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智界 S7 搭载业界最薄 800V 高压
- 下一篇: 猫头鹰黑色版 NH-D9L / NH-L