文章

282

粉丝

20

获赞

833

访问

154.1k

头像
细菌的繁殖 题解:最快解法,矩阵快速幂
P1033
发布于2026年2月19日 17:56
阅读数 151

如代码所示,时间复杂度logn

#include <iostream>
#include <vector>
using namespace std;

typedef long long ll;
typedef vector<vector<ll>> mat;

mat mul(mat a, mat b) {
	mat res(a.size(), vector<ll>(b[0].size(), 0));
	for (int i = 0; i < a.size(); i++)
		for (int k = 0; k < b.size(); k++)
			if (a[i][k])
				for (int j = 0; j < b[0].size(); j++)
					res[i][j] += a[i][k] * b[k][j];
	return res;
}

mat pow(mat a, ll p) {
	mat res(a.size(), vector<ll>(a.size(), 0));
	for (int i = 0; i < a.size(); i++) res[i][i] = 1;
	while (p) {
		if (p & 1) res = mul(res, a);
		a = mul(a, a);
		p >>= 1;
	}
	return res;
}

ll solve(ll n) {
	if (n == 1) return 1;
	mat M = {{1,4,0}, {0,1,1}, {0,0,1}};
	mat V = {{1}, {1}, {1}};
	mat Mpow = pow(M, n-1);
	mat res = mul(Mpow, V);
	return res[0][0];
}

int main() {
	ios::sync_with_stdio(false),cin.tie(0);ll n;
	cin >> n;
	while( n--){
		int x;
		cin >> x;
...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发