poj3070

3 篇文章 0 订阅
1 篇文章 0 订阅

矩阵乘法:

struct matrix
{
     int m[2][2];
};


matrix mul(matrix a,matrix b)
{
     matrix c;
     c.m[0][0]=(a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0])%k;
     c.m[0][1]=(a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1])%k;
     c.m[1][0]=(a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0])%k;
     c.m[1][1]=(a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1])%k;
     return c;
}


矩阵快速幂:

struct matrix
{
     int m[2][2];
};

matrix did(matrix a,long long n)
{
     matrix c;
     if (n==0) {c.m[0][0]=1;c.m[0][1]=0;c.m[1][0]=0;c.m[1][1]=1;}
     else
     {    matrix d;
          d=did(a,n/2);
          if (n%2==1) c=mul(mul(d,d),a);
          else c=mul(d,d);
     }
     return c;
}


#include <iostream>

#include <stdio.h>


using namespace std;


int k=10000;


struct matrix
{
     int m[2][2];
};


matrix mul(matrix a,matrix b)
{
     matrix c;
     c.m[0][0]=(a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0])%k;
     c.m[0][1]=(a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1])%k;
     c.m[1][0]=(a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0])%k;
     c.m[1][1]=(a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1])%k;
     return c;
}


matrix did(matrix a,long long n)
{
     matrix c;
     if (n==0) {c.m[0][0]=1;c.m[0][1]=0;c.m[1][0]=0;c.m[1][1]=1;}
     else
     {    matrix d;
          d=did(a,n/2);
          if (n%2==1) c=mul(mul(d,d),a);
          else c=mul(d,d);
     }
     return c;
}


int main()
{   long long n;
    matrix ans,e;
    freopen("in.txt","r",stdin);
    e.m[0][0]=1;e.m[0][1]=1;e.m[1][0]=1;e.m[1][1]=0;
    while (cin>>n)
    {
         if (n==-1) break;
         if (n==0) cout<<'0'<<endl;
         else
         {
              ans=did(e,n-1);
              cout<<ans.m[0][0]%k<<endl;
         }
    }
    return 0;

}

题意:求第m个斐波那契数MOD10000的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值