neu1250矩阵快速幂哪~~

其实呢,自己乱测试数据也是会发现BUG的

一直都会是自己的代码错误!

折腾了我一大晚上到头来竟然矩阵数组的存储也是long long类型

不过终归是解决了   稍微学到一点教训吧

一个是写完代码  自己可以代几组数据试一下  有时候会出现那种很明显的错误  比如这个题出现负数神马啦

再一个经验是Long long 真的比int 好用??

自己的程序几乎每个地方都可能超出范围

再最后是简单的程序也要多练 现在 自己敲一遍矩阵的乘法

#include<stdio.h>
#include<string.h>
#define da 100000007
struct M
{
    long long s[3][3];
};
struct M multiply(struct M a,struct M b){
    struct M c;
    memset(c.s,0,sizeof(c.s));
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            for(int k=0;k<3;k++)
                c.s[i][j]=(c.s[i][j]+(a.s[i][k]*b.s[k][j])%da)%da;
    return c;
}
struct M paw(struct M a,long long t){
    if(t==1)
        return a;
    else{
        struct M b=paw(a,t/2);
        
        if(t&1){
            return multiply(multiply(b,b),a);
        }
        else
            return multiply(b,b);
    }
}
int main()
{
    struct M a,c;
    a.s[0][0]=3;a.s[0][1]=2;a.s[0][2]=1;
    a.s[1][0]=1;a.s[1][1]=0;a.s[1][2]=0;
    a.s[2][0]=0;a.s[2][1]=1;a.s[2][2]=0;
    int a1,a2,a3;
    long long n;
    while(scanf("%d%d%d%lld",&a1,&a2,&a3,&n)!=EOF)
    {
        if(n==0) { printf("%d\n",a1%da);}
        else if(n==1) {printf("%d\n",a2%da);}
        else if(n==2) { printf("%d\n",a3%da);}
        else{
        c=paw(a,n-2);
        long long x=(c.s[0][0]*(a3%da)+c.s[0][1]*(a2%da)+c.s[0][2]*(a1%da))%da;
        printf("%lld\n",x);
        }
    }
   return 0;
}

  按位与“&”功能强大?

for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
           for(int k=0;k<N;k++)
              {c.s[i][j]+=(a.s[i][k]%da)*(b.s[k][j]%da);
               c.s[i][j]%=da;//因为各对应行列为i,j
              }//也对

以后矩阵快速幂用这个自己写的吧....

 

posted @ 2013-04-12 19:33  闭关修炼的小孩纸  阅读(106)  评论(0编辑  收藏  举报