51Nod - 1113 矩阵快速幂

51Nod - 1113 矩阵快速幂

给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果。

Input

第1行:2个数N和M,中间用空格分隔。N为矩阵的大小,M为M次方。(2 <= N <= 100, 1 <= M <= 10^9)
第2 - N + 1行:每行N个数,对应N * N矩阵中的1行。(0 <= N[i] <= 10^9)

Output

共N行,每行N个数,对应M次方Mod (10^9 + 7)的结果。

Input示例

2 3
1 1
1 1

Output示例

4 4
4 4

题解:

    快速矩阵幂。

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
const int MOD = 1e9 + 7;
typedef long long LL; 

int n, m, x; 

vector<vector<LL> > multiple(const vector<vector<LL> > &a, const vector<vector<LL> > &b){
	vector<vector<LL> > ans(n, vector<LL>(n, 0));
	for(int i=0; i<n; ++i){
		for(int j=0; j<n; ++j){
			for(int k=0; k<n; ++k){
				ans[i][j] += (a[i][k] * b[k][j]) % MOD;
				ans[i][j] = ans[i][j] % MOD;
			}
		}
	}
	return ans;
}

vector<vector<LL> > power_matrix(vector<vector<LL>> t, int num){
	vector<vector<LL> > ans(n, vector<LL>(n, 0));
	for(int i=0; i<n; ++i){
		ans[i][i] = 1;
	}
	while(num){
		if(num%2 == 1){
			ans = multiple(ans, t);
		}
		t = multiple(t, t);
		num = num / 2;
	}
	return ans;
}

int main(){

	while(scanf("%d %d", &n, &m) != EOF){
		vector<vector<LL> > t;
		for(int i=0; i<n; ++i){
			vector<LL> tmp;
			for(int j=0; j<n; ++j){
				scanf("%d", &x);
				tmp.push_back(x);
			}
			t.push_back(tmp);
		}

		vector<vector<LL> > ans = power_matrix(t, m); 

		for(int i=0; i<n; ++i){
			for(int j=0; j<n-1; ++j){
				printf("%d ", ans[i][j] );
			}
			printf("%d\n", ans[i][n-1] );
		}

	}
	return 0;
}

  

时间: 2024-11-12 14:42:44

51Nod - 1113 矩阵快速幂的相关文章

1113 矩阵快速幂

1113 矩阵快速幂 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果. Input 第1行:2个数N和M,中间用空格分隔.N为矩阵的大小,M为M次方.(2 <= N <= 100, 1 <= M <= 10^9) 第2 - N + 1行:每行N个数,对应N * N矩阵中的1行.(0 <= N[i] <= 10^9) Output 共N行,每行N个数,对应M次方Mod (1

NOD 1113矩阵快速幂

基准时间限制:3 秒 空间限制:131072 KB 分值: 40 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果. Input 第1行:2个数N和M,中间用空格分隔.N为矩阵的大小,M为M次方.(2 <= N <= 100, 1 <= M <= 10^9) 第2 - N + 1行:每行N个数,对应N * N矩阵中的1行.(0 <= N[i] <= 10^9) Output

51nod 1242 矩阵快速幂

斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...) 给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可. Input 输入1个数n(1 <= n <= 10^18). Output 输出F(n) % 1000000009的结果. Input示例 11 Outp

51nod 1537 分解(矩阵快速幂)

分析:先写出前几项,发现都是有解的.记(1+√2)^n=a+b√2,可以归纳证明,当n为奇数时,m=a^2+1,n为偶数时,m=a^2.写出a的递推式,用矩阵快速幂算一下a即可. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int p=1e9+7; 6 typedef unsigned long long ull; 7 ull mat

51nod 算法马拉松18 B 非010串 矩阵快速幂

非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) Input 一个数n,表示长度.(n<1e15) Output 长度为n的非010串的个数.(对1e9+7取模) Input示例 3 Output示例 7 解释: 000 001 011 100 101 110 111 读完题,这样的题目肯定是能找到规律所在的,要不然数据太大根本无法算.假设现在给的

【51Nod 1341】混合序列 矩阵快速幂

题意 给定两个数列\(a_n=pa_{n-1}+r,a_0=0\) , \(b_n=qb_{n-1},b_0=3\) , 求\(\sum_{i=0}^{n}a_i\times b_{n-i} \mod {1e9+7}\) 如果\(n\)的范围是\(1e7\),可以用FFT加速卷积 这题范围过大,所以只能用别的方法 令\(f_n=\sum_{i=0}^{n}a_i\times b_{n-i}\) , 那么\(f_{n+1}=\sum_{i=0}^{n+1}a_i\times b_{n+1-i}=\

51nod1113(矩阵快速幂模板)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: 1 #include <iostream> 2 #define ll long long 3 using namespace std; 4 5 const int mod = 1e9+7; 6 const int MAXN = 1e2+10; 7 int n, m; 8 9 typedef struct

矩阵快速幂总结

基础:快速幂,矩阵乘法: 快速幂: #include<cstdio> #include<cstring> #define ll long long ll poww(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans*=a; b>>=1;a*=a; } return ans; } int main() { ll a,b; scanf("%lld %lld",&a,&b); ll ans=p

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr