【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 1005 #define MAXLOG 32 int n, m, K; double f[2][MAXN], matrix[MAXLOG][MAXN][MAXN]; int main() { scanf("%d%d%d", &n, &m, &K); for (int i = 1; i <= n; i++) scanf("%lf", &f[0][i]); if (n == 1) { printf("%.3lf\n", f[0][1]); return 0; } for (int i = 1; i <= n; i++) { matrix[0][i][i] = (double) (m - 1) / (double) m; if (i != n) matrix[0][i][i + 1] = 1.0 / m; else matrix[0][i][1] = 1.0 / m; } for (int p = 1; p < MAXLOG; p++) { for (int i = 1; i <= 1; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) matrix[p][i][j] += matrix[p - 1][i][k] * matrix[p - 1][k][j]; for (int i = 2; i <= n; i++) for (int j = 1; j <= n; j++) if (j == 1) matrix[p][i][j] = matrix[p][i - 1][n]; else matrix[p][i][j] = matrix[p][i - 1][j - 1]; } for (int p = 0; p < MAXLOG; p++) { int now = 1 << p; if ((now & K) != 0) { K ^= now; for (int i = 1; i <= 1; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) f[i][j] += f[i - 1][k] * matrix[p][k][j]; for (int i = 1; i <= n; i++) { f[0][i] = f[1][i]; f[1][i] = 0; } } } for (int i = 1; i <= n; i++) printf("%.3lf\n", f[0][i]); return 0; }