又是矩阵 Uva上的一道 经典题目

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1811

 

不过我测试数据 第三组没过 估计是 取余这里错了

代码还是  贴一下吧。。  到时候 再 贴ac代码

 

#include<iostream>
using namespace std;
struct node{int p[100][100];};
node a,b,c,f;
int mod;
node cheng(node a,node b,int n,int t,int m )
{
    int i,j,k;
    node c;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            int w;
            c.p[i][j]=0;
            for(k=0;k<t;k++)
            {
                w=((a.p[i][k]%mod)*(b.p[k][j]%mod))%mod;
                c.p[i][j]=(c.p[i][j]+w)%mod;
            }
        }
    return c;
}


void solve(__int64 n,int r,int q,int l)
{
    while(n)
    {
        if(n%2==1)
            b=cheng(a,b,r,q,l);
        a=cheng(a,a,r,q,l);
        n/=2;
    }
}

int main()
{
    int i,j,d;
    __int64 n;
    while(scanf("%d%I64d%d",&d,&n,&mod))
    {
        if(d==0&&n==0&&mod==0)
            break;
        for(i=0;i<d;i++)
            for(j=0;j<d;j++)
            {
                if(i+1==j)
                    a.p[i][j]=1;
                else if(i==d-1)
                    scanf("%d",&a.p[i][j]);
                else a.p[i][j]=0;
            }
            for(i=0;i<d;i++)   //b为单位矩阵
                for(j=0;j<d;j++)
                    if(i==j )  b.p[i][j]=1;
                    else b.p[i][j]=0;
            solve(n-d,d,d,d);
            for(i=0;i<d;i++)
               scanf("%d",&f.p[i][0]);
            node temp;
            temp=cheng(b,f,d,d,1);
            if(n<=d)
                printf("%d",f.p[n-1][0]);
            else 
                printf("%d\n",temp.p[d-1][0]);
            //printf("  mod %d\n",mod);
    }
    return 0;
}



 

posted @ 2013-05-30 20:43  galaxy77  阅读(146)  评论(0编辑  收藏  举报