题解:B4337 [中山市赛 2023] 简单数学题
Analysis
递推推式子好题。
我们设第
先看从盒一转移到盒二点过程。我们有
- 开始取出白球(概率为
\frac{X_{i-1}}{A} )。那么盒二中有S-X_{i-1}+1 个白球,盒一白球数期望增加\frac{S-X_{i-1}+1}{B+1} 。 - 开始取出黑球(概率为
\frac{A-X_{i-1}}{A} )。那么盒二中有S-X_{i-1} 个白球,盒一白球数期望增加\frac{S-X_{i-1}}{B+1} 。
综合来看,由加法原理可得盒一白球数期望增加
我们令
由于操作次数
最终答案即为
Code
#include"bits/stdc++.h"
#define int long long
using namespace std;
const int mod = 998244353;
int n, a1, a2, b1, b2;
struct matrix {
int mat[3][3];
int r, c;
matrix () {
memset(mat, 0, sizeof mat);
}
int *operator[] (int i) {
return mat[i];
}
matrix operator* (matrix &b) const {
matrix re;
re.r = r, re.c = b.c;
for (int i = 1; i <= r; i++)
for (int k = 1; k <= c; k++)
for (int j = 1; j <= b.c; j++)
re[i][j] = (re[i][j] + mat[i][k] * b[k][j]) % mod;
return re;
}
};
matrix qpow(matrix a, int b) {
matrix re;
re[1][1] = re[2][2] = 1;
re.r = re.c = 2;
while (b) {
if (b & 1)
re = re * a;
a = a * a;
b >>= 1;
}
return re;
}
int fpow(int a, int b) {
a %= mod;
int re = 1;
while (b) {
if (b & 1)
re = re * a % mod;
a = a * a % mod;
b >>= 1;
}
return re;
}
signed main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> n >> a1 >> a2 >> b1 >> b2;
int a = (a1 + a2) % mod, b = (b1 + b2) % mod, s = (a1 + b1) % mod;
matrix t;
t[1][1] = (a - 1) % mod * b % mod * fpow(a * (b + 1) % mod, mod - 2) % mod;
t[1][2] = s * fpow(b + 1, mod - 2) % mod;
t[2][2] = 1;
t.r = t.c = 2;
t = qpow(t, n);
int ans = (t[1][1] * (a1 % mod) % mod + t[1][2]) % mod;
ans = ans * fpow(a, mod - 2) % mod;
cout << ans;
return 0;
}