POJ 3233 Matrix Power Series(二分等比求和)

Matrix Power Series

【题目链接】Matrix Power Series

【题目类型】二分等比求和

&题解:

这题我原来用vector写的,总是超时,不知道为什么,之后就改用数组了,照着别人的代码敲了一遍

【时间复杂度】O(logn)

&代码:

#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N= 30 +9;

struct Matrix
{
	int m[N][N];
};
Matrix I;
int n,k,M;

Matrix add(Matrix a,Matrix b)
{
	Matrix c;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c.m[i][j]=(a.m[i][j]+b.m[i][j])%M;
	return c;
}

Matrix multi(Matrix a,Matrix b)
{
	Matrix c;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			c.m[i][j]=0;
			for(int k=0;k<n;k++)
				c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%M;
		}
	}
	return c;
}
Matrix power(Matrix A,ll n)
{
	Matrix ans=I;
	while(n){
		if(n&1)
			ans=multi(ans,A);
		A=multi(A,A);
		n>>=1;
	}
	return ans;
}

Matrix sum(Matrix A,ll k)
{
	if(k==1) return A;
	Matrix t=sum(A,k/2);
	Matrix cur=power(A,k/2+(k&1));
	t=add(t,multi(t,cur));
	if(k&1) t=add(t,cur);
	return t;
}

int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//	freopen("E:1.txt","r",stdin);
	while(cin>>n>>k>>M){
		Matrix A;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				cin>>A.m[i][j];
				A.m[i][j]%=M;
			}
			I.m[i][i]=1;
		}
		Matrix ans=sum(A,k);
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++)
				cout<<ans.m[i][j]<<" ";
			cout<<endl;
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/s1124yy/p/6652690.html