Hubby 1 for fibby~

来源:互联网 发布:手绘画软件 编辑:程序博客网 时间:2024/06/04 00:46
//快速幂才是关键
#include<iostream>
#define b 1000000007  
using namespace std;
long long fib(int n)
{
    long long mtx[2][2];
    long long base[2][2];
    
    mtx[0][0]=1;mtx[0][1]=0;
    mtx[1][0]=0;mtx[1][1]=1;
    
    base[0][0]=1;base[0][1]=1;
    base[1][0]=1;base[1][1]=0;
    
    if(n==-1)
    return 0;
    if(n==0)
    return 1;
    
    long long temp1,temp2,temp3,temp4;
    while(n!=0)
    {   
        if(n&1==1)
        {
            
            temp1=mtx[0][0]*base[0][0]+mtx[0][1]*base[1][0];temp2=mtx[0][0]*base[0][1]+mtx[0][1]*base[1][1];
            temp3=mtx[1][0]*base[0][0]+mtx[1][1]*base[1][0];temp4=mtx[1][0]*base[0][1]+mtx[1][1]*base[1][1];
        
            mtx[0][0]=temp1%b,mtx[0][1]=temp2%b;
            mtx[1][0]=temp3%b,mtx[1][1]=temp4%b;
        }
        
        temp1=base[0][0]*base[0][0]+base[1][0]*base[1][0];temp2=base[0][0]*base[0][1]+base[0][1]*base[1][1];
        temp3=base[1][0]*base[0][0]+base[1][1]*base[1][0];temp4=base[1][0]*base[0][1]+base[1][1]*base[1][1];
        
        base[0][0]=temp1%b,base[0][1]=temp2%b;
        base[1][0]=temp3%b,base[1][1]=temp4%b;
        
        n=n>>1; 
    }
    
    return mtx[0][0];
}


int main()
{
    int n;
    while(cin>>n)
    {
        cout<<fib(n-1)<<endl;
    }   
}                                 
0 0
原创粉丝点击