hdu1575 Tr A

来源:互联网 发布:瓷砖设计的软件 编辑:程序博客网 时间:2024/05/22 13:08

矩阵快速幂取模

一定要每一步都取模!否则WA.


#include <cstdio>#include <cstring>using namespace std;int x,n,k,mod=9973;struct Matrix{    int pos[11][11];    friend Matrix operator*(Matrix a,Matrix b)    {        Matrix c;        memset(c.pos,0,sizeof(c.pos));        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)            {                for(int k=0;k<n;k++)                {                    c.pos[i][j]+=(a.pos[i][k]*b.pos[k][j])%mod;                }                c.pos[i][j]%=mod;            }        return c;    }}matrix;/*void debug(Matrix a){    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)            printf("%d\t",a.pos[j][i]);        puts("");    }    puts("");}*/int tr(Matrix tmp){    //debug(tmp);    Matrix res;    memset(res.pos,0,sizeof(res.pos));    for(int i=0;i<n;i++)        res.pos[i][i]=1;    for(int i=0;k>>i;i++)    {        int num=k>>i;        if(num&1)            res=res*tmp;        tmp=tmp*tmp;    }    int cnt=0;    for(int i=0;i<n;i++)        cnt=(cnt+res.pos[i][i])%mod;    //printf("cnt:%d\n",cnt);    return cnt;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&k);        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)                scanf("%d",&matrix.pos[i][j]);        //debug(matrix);        printf("%d\n",tr(matrix)%mod);    }    return 0;}

0 0
原创粉丝点击