码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵快速幂

时间:2015-12-08 23:44:39      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

先来一种简单的情况,用矩阵快速幂计算斐波那契数列;

下面的代码很好理解

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct mat{
    int at[2][2];
};
mat d;
int n,mod;
mat mul(mat a,mat b)
{
    mat t;
    memset(t.at,0,sizeof(t.at));
    for(int i=0;i<n;++i)
    {
        for(int k=0;k<n;++k)
        {
             if(a.at[i][k])
                  for(int j=0;j<n;++j)
                 {
                         t.at[i][j]+=a.at[i][k]*b.at[k][j];
                          if(t.at[i][j]>=mod){t.at[i][j]%=mod;}
                   }
          }
    }
    return t;
}
mat expo(mat p,int k)
{
     if(k==1)return p;
     mat e;
     memset(e.at,0,sizeof(e.at));
     for(int i=0;i<n;++i){e.at[i][i]=1;}
     if(k==0)return e;
     while(k)
     {
          if(k&1)e=mul(p,e);
          p=mul(p,p);
          k>>=1;
     }
    return e;
}
int main()
{
    n=2;mod=10000;
    d.at[1][1]=0;
    d.at[0][0]=d.at[1][0]=d.at[0][1]=1;          //这样的矩阵不断的********就好了,就能计算出了,不难模拟。然后既然这样的话就快速幂一下
    int k;
    while(~scanf("%d",&k))
    {
          if(k==-1)break;
          mat ret=expo(d,k);
          int ans=ret.at[0][1]%mod;
          printf("%d\n",ans);
     }
     return 0;
}

 

矩阵快速幂

标签:

原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5031135.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!