【BZOJ4204】取球游戏

本文介绍了一种使用矩阵快速幂的方法来高效求解概率转移问题。具体地,通过预处理概率转移矩阵的不同幂次,进而快速计算经过特定步数后的状态概率分布。适用于起点确定、转移规则明确的概率型问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目链接】

【思路要点】

  • 补档博客,无题解。

【代码】

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值