是小学数学题吗?
Problem:E
Time Limit:1000ms
Memory Limit:65535K
Description
我还是从前那个少年,没有"亿"丝丝改变!
在家学习肯定很累吧???大学的题可太难了!!!好像回到小学呀QAQ~~。
忽然,你拿起了表弟的数学作业本,看到表弟竟然做错了,于是作为数学dalao的你想要在表弟面前秀一波操作。
题目的描述是这样的:先在已知A为 n×n 的矩阵,让你求 S = 2{m-1}×A+2{m-2}×A2+……+2{m-m}×A^m
果然,你不到1s就在大脑中算出了答案S,并且S的每一个元素对 1e9+7 取模。
Input
第一行,包含两个正整数 n ,m ,分别代表矩阵A的大小和S中的项数。(1<=n<=30,1<=m<=1e9)
第二行到第 n+1 行,每行 n 个元素,相应地代表A中的元素 x 。(0<=x<=1e6)
Output
输出包括 n 行,每行 n 个元素,代表S中的每一个元素对 1e9+7 取模后的值。
Sample Input
1 2020
1
Sample Output
549133931
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const ll mod = 1000000007;
int n;
struct Matrix
{
ll m[70][70];
Matrix() //初始化
{
memset(m, 0, sizeof(m));
}
};
Matrix Multi(Matrix a, Matrix b) //矩阵乘法
{
Matrix res;
for (int i = 1; i <= 2 * n; i++)
for (int j = 1; j <= 2 * n; j++)
for (int k = 1; k <= 2 * n; k++)
res.m[i][j] = (res.m[i][j] + a.m[i][k] * b.m[k][j]) % mod;
return res;
}
Matrix fastm(Matrix a, int m) //矩阵快速幂
{
Matrix res;
for (int i = 1; i <= 2 * n; i++) //相当于普通快速幂中的res=1,注意
res.m[i][i] = 1;
while (m)
{
if (m & 1)
res = Multi(res, a);
a = Multi(a, a);
m >>= 1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
int m;
Matrix num;
cin >> n >> m;
for (int i = 1; i <= n; i++) //构造矩阵B
for (int j = 1; j <= n; j++)
{
cin >> num.m[i][j];
num.m[i][j + n] = num.m[i][j];
}
for (int i = n + 1; i <= 2 * n; i++) //构造矩阵B
num.m[i][i] = 2;
Matrix ans = fastm(num, m); //矩阵快速幂
for (int i = 1; i <= n; i++) //输出答案矩阵
for (int j = n + 1; j <= 2 * n; j++)
{
cout << ans.m[i][j];
if (j != 2 * n)
cout << " ";
else
cout << endl;
}
return 0;
}