矩阵快速幂

来源:互联网 发布:magento2 cms block 编辑:程序博客网 时间:2024/06/05 19:28

1113 矩阵快速幂
基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注
给出一个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 <algorithm>#include <stdio.h>#include <cstring>#include <cmath>using namespace std;const long long mod=1000000007;long long a[150][150];long long b[150][150];long long c[150][150];long long s[150][150];int d[10000];int main(){    int n,m;    while(cin>>n>>m)    {        int i,j;        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)                cin>>a[i][j];        }        memset(d,0,sizeof(d));        i=0;j=0;        long long t=m;        while(t>0)        {            if(t%2==1)            {                d[i]=j;                //cout<<d[i]<<' '<<i<<endl;                i++;            }            t=t/2;            j++;        }        int w=i;        for(int r=0;r<w;r++)        {            for(i=0;i<n;i++)                for(j=0;j<n;j++)                c[i][j]=a[i][j];                while(d[r]--)                {                    for(i=0;i<n;i++)                    {                        for(j=0;j<n;j++)                        {   long long ss=0;                            for(int k=0;k<n;k++)                            {                                ss+=c[i][k]*c[k][j]%mod;                            }                            b[i][j]=ss%mod;                        }                    }                    for(i=0;i<n;i++)                        for(j=0;j<n;j++)                        c[i][j]=b[i][j];                }            if(r==0)            {                    for(i=0;i<n;i++)                        for(j=0;j<n;j++)                        s[i][j]=c[i][j];            }            else            {                for(i=0;i<n;i++)                {                    for(j=0;j<n;j++)                    {   long long ss=0;                        for(int k=0;k<n;k++)                        {                            ss+=s[i][k]*c[k][j]%mod;                        }                        b[i][j]=ss%mod;                    }                }                    for(i=0;i<n;i++)                        for(j=0;j<n;j++)                        s[i][j]=b[i][j];            }        }        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            {                cout<<s[i][j]<<' ';            }            cout<<endl;        }    }}
0 0
原创粉丝点击