矩阵乘法模板

50579 Fibonacci 第 n 项

题目链接:https://ac.nowcoder.com/acm/problem/50579

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

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

ll M;

mat mul(mat A, mat B)
{
	mat C(A.size(), vec(B[0].size()));
	for (int i = 0; i < A.size(); i++)
		for (int k = 0; k < B.size(); k++)
			for (int j = 0; j < B[0].size(); j++)
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
	return C;
}

mat pow(mat A, ll n)
{
	mat B(A.size(), vec(A.size()));
	for (int i = 0; i < A.size(); i++)
		B[i][i] = 1;
	while (n > 0)
	{
		if (n & 1) B = mul(B, A);
		A = mul(A, A);
		n >>= 1;
	}
	return B;
}

int main(void)
{
	ll n;
	cin >> n >> M;
	mat A(2, vec(2));
	A[0][0] = 1; A[0][1] = 1;
	A[1][0] = 1; A[1][1] = 0;
	A = pow(A, n);
	cout << A[1][0] << endl;
	
	return 0;
}

50580 Fibonacci 前 n 项和

题目链接:https://ac.nowcoder.com/acm/problem/50580

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

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

ll M;

mat mul(mat A, mat B)
{
	mat C(A.size(), vec(B[0].size()));
	for (int i = 0; i < A.size(); i++)
		for (int k = 0; k < B.size(); k++)
			for (int j = 0; j < B[0].size(); j++)
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
	return C;
}

mat pow(mat A, ll n)
{
	mat B(A.size(), vec(A.size()));
	for (int i = 0; i < A.size(); i++)
		B[i][i] = 1;
	while (n > 0)
	{
		if (n & 1) B = mul(B, A);
		A = mul(A, A);
		n >>= 1;
	}
	return B;
}

int main(void)
{
	ll n;
	cin >> n >> M;
	mat A(3, vec(3));
	A[0][0] = 1; A[0][1] = 1; A[0][2] = 0;
	A[1][0] = 0; A[1][1] = 1; A[1][2] = 1;
	A[2][0] = 0; A[2][1] = 1; A[2][2] = 0;
	A = pow(A, n);
	cout << A[0][1] << endl;
	
	return 0;
}

50581 佳佳的 Fibonacci

题目链接:https://ac.nowcoder.com/acm/problem/50581
题解链接:https://blog.csdn.net/qq_43330483/article/details/98210807

这道题就需要推公式了

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

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

ll M;

mat mul(mat A, mat B)
{
	mat C(A.size(), vec(B[0].size()));
	for (int i = 0; i < A.size(); i++)
		for (int k = 0; k < B.size(); k++)
			for (int j = 0; j < B[0].size(); j++)
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
	return C;
}

mat pow(mat A, ll n)
{
	mat B(A.size(), vec(A.size()));
	for (int i = 0; i < A.size(); i++)
		B[i][i] = 1;
	while (n > 0)
	{
		if (n & 1) B = mul(B, A);
		A = mul(A, A);
		n >>= 1;
	}
	return B;
}

int main(void)
{
	ll n;
	cin >> n >> M;
	mat A(2, vec(2));
	A[0][0] = 1; A[0][1] = 1;
	A[1][0] = 1; A[1][1] = 0;
	A = pow(A, n + 2);
	ll ans = ((n % M) * (A[1][0] % M)) % M;
	ans = (ans + M - A[0][0] + 2) % M; 
	cout << ans << endl;
	
	return 0;
}

50582 Fibonacci

题目链接:https://ac.nowcoder.com/acm/problem/50582

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

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

ll M = 1e4;

mat mul(mat A, mat B)
{
	mat C(A.size(), vec(B[0].size()));
	for (int i = 0; i < A.size(); i++)
		for (int k = 0; k < B.size(); k++)
			for (int j = 0; j < B[0].size(); j++)
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
	return C;
}

mat pow(mat A, ll n)
{
	mat B(A.size(), vec(A.size()));
	for (int i = 0; i < A.size(); i++)
		B[i][i] = 1;
	while (n > 0)
	{
		if (n & 1) B = mul(B, A);
		A = mul(A, A);
		n >>= 1;
	}
	return B;
}

int main(void)
{
	ll n;
	while (cin >> n && n != -1)
	{
		mat A(2, vec(2));
		A[0][0] = 1; A[0][1] = 1;
		A[1][0] = 1; A[1][1] = 0;
		A = pow(A, n);
		cout << A[1][0] << endl;
	}
	return 0;
}
发布了199 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/104238388