您的位置:首页 > 其它

洛谷 P3390 【模板】矩阵快速幂

2017-09-02 14:48 246 查看
题目>>https://www.luogu.org/problem/show?pid=3390

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long num[105][105],l,ji[105][105],ji2[105][105];
int n,i,j,k;
void jzcf(long long a[105][105],long long b[105][105]) //由于这里传入的是地址因此可以赋值。
{
for(i = 1;i <= n;i ++)
for(j = 1;j <= n;j ++)
ji2[i][j] = a[i][j],a[i][j] = 0; //用a来储存答案。
if(a == b) //若a与b的地址相同 ,则把b的地址修改数值相同的ji。
b = ji2;
for(i = 1;i <= n;i ++)
for(j = 1;j <= n;j ++)
for(k = 1;k <= n;k ++)
a[i][j] = (a[i][j] + (b[i][k] * ji2[k][j])) % 1000000007;
// 第i行的每一个数 * 第j列的每一个数之和就是a[i][j]的值。
}
void sqr(long long x) //快速幂。
{
while(x)
{
if(x & 1 == 1)
jzcf(ji,num);
jzcf(num,num);
x = x >> 1;
}
}
int main()
{
scanf("%d%lld",&n,&l);
for(i = 1;i <= n;i ++)
for(j = 1;j <= n;j ++)
scanf("%lld",&num[i][j]),ji[i][j] = num[i][j]; //ji是原矩阵 * 1;
sqr(l - 1); // 已经有了一个 * 1的矩阵。
for(i = 1;i <= n;i ++)
{
for(j = 1;j <= n;j ++)
printf("%lld ",ji[i][j]);
puts("");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: