构造母函数 f(x)=i=1∏nm=0∑∞pimxm(1),对于每一项 m=0∑∞pimxm,指数 m 表示数字 i 出现的次数,pim 就是 i 连续出现 m 次的概率。每一个数的出现次数都对应多项式 m=0∑∞pimxm,将这 n 个多项式进行卷积运算,即为 f(x)。卷积的结果为 f(x)=m=0∑∞amxm,m 为生成序列的长度,系数 am 自然是生成长度为 m 的非递减序列的概率。仔细思考,am 同时也是游戏进行轮次超过 m 次的概率,即 f(x)=m=0∑∞P(len>m)xm(2);因为游戏已经进行了 m 轮,且可以继续进行,游戏要进行超过 m 轮等价于生成长度为 m 的非递减序列。
#include<iostream> usingnamespace std; typedeflonglong ll; constint MOD = 998244353; constint MAX_SIZE = 105; int n, w[MAX_SIZE]; ll QuickPower(ll a, ll b) { ll res = 1; while (b) { if (b & 1) { res = res * a % MOD; } a = a * a % MOD; b >>= 1; } return res; } intmain() { cin >> n; int sum = 0; for (int i = 1;i <= n;i++) { cin >> w[i]; sum += w[i]; } // 求 f(1) int a = 1; for (int i = 1;i <= n;i++) { a = 1ll * a * sum % MOD * QuickPower(sum - w[i], MOD - 2) % MOD; } // 求 f'(1) int b = 0; for (int i = 1;i <= n;i++) { b = (b + 1ll * w[i] * QuickPower(sum - w[i], MOD - 2) % MOD) % MOD; } b = 1ll * b * a % MOD; // 输出答案 cout << (2ll * b % MOD + a) % MOD << endl; return0; }