E - Random Swaps of Balls
キーワード
解説
まず、 に対して、 を次のように定める。
回の操作の後、 番目に黒いボールがある確率。
で初期化される。
回目の操作の後、 番目に黒いボールがあるのは、次の 2 通りのいずれかである。
- 回目の操作の後、 番目に黒いボールがあり、 回目の操作でそのボールが移動しなかった。
- 回目の操作の後、 番番目に黒いボールがあり、 回目の操作で 番目のボールと 番目のボールが交換された。
それぞれの条件付き確率は、 と であるから、次のような漸化式が成り立つ。
ここで、 に対して、 を次のように定める。
回目の操作の後の黒いボールの位置の期待値。
すると、 であるから、
という漸化式が得られる。最初、黒いボールは 番目にあるから である。
これは、 で計算可能。
提出コード
- Go
const MOD = 998244353
func main() {
var n, k int
scanIntVariables(&n, &k)
dp := make([]int, k+1)
dp[0] = 1
for i := 1; i <= k; i++ {
dp[i] = (n-2)*modPow(n, MOD-2, MOD)%MOD*dp[i-1]%MOD + (n+1)*modPow(n, MOD-2, MOD)%MOD
dp[i] %= MOD
}
writeLine(dp[k])
}
- C++
const ll MOD = 998244353;
ll modPow(ll x, ll n, ll mod) {
ll res = 1;
while(n > 0) {
if(n & 1) res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}
int main() {
ll n,k; cin >> n >> k;
vector<ll> dp(k+1);
dp[0] = 1;
rep(i,1,k+1) {
dp[i] = (n-2)*modPow(n, MOD-2, MOD)%MOD*dp[i-1]%MOD + (n+1)*modPow(n, MOD-2, MOD)%MOD;
dp[i] %= MOD;
}
cout << dp[k] << endl;
}