矩阵快速幂

来源:互联网 发布:滤镜软件原宿风 编辑:程序博客网 时间:2024/06/01 07:59

A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。 
Input
数据的第一行是一个T,表示有T组数据。 
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。 
Output
对应每组数据,输出Tr(A^k)%9973。
Sample Input
22 21 00 13 999999991 2 34 5 67 8 9
Sample Output
22686

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n,k;const int mod=9973;struct node{    int a[11][11];}f,g;node mul(node q,node p){    node z;    for(int i=0; i<n; i++)    {        for(int j=0; j<n; j++)        {            z.a[i][j]=0;            for(int k=0; k<n; k++)            {                z.a[i][j]=(z.a[i][j]+q.a[i][k]*p.a[k][j]%mod)%mod;            }        }    }    return z;}node A(node x,node s,int b){    while(b)    {        if(b&1)        {            s=mul(s,x);        }        x=mul(x,x);        b>>=1;    }    return s;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int ans=0;        scanf("%d %d",&n,&k);        for(int i=0; i<n; i++)            for(int j=0; j<n; j++)            {                scanf("%d",&f.a[i][j]);                g.a[i][j]=f.a[i][j];            }        node aa=A(f,g,k-1);        for(int i=0;i<n;i++)        {            ans=(ans+aa.a[i][i])%mod;        }        printf("%d\n",ans%mod);    }    return 0;}


原创粉丝点击