poj3070 单位矩阵(转移矩阵构造)+矩阵快速幂

太妙了。。通过矩阵乘法来加速递推

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define mod 10000
int n;
void mul(int f[],int a[2][2]){//一维数组和矩阵相乘 
    int c[2]={};
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            c[j]=(c[j]+(long long)f[i]*a[i][j])%mod;
    memcpy(f,c,sizeof c);
}
void mulself(int a[2][2]){//矩阵自乘 
    int c[2][2]={};
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            for(int k=0;k<2;k++)
                c[i][j]=(c[i][j]+(long long)a[i][k]*a[k][j])%mod; 
    memcpy(a,c,sizeof c);
}

int main(){
    while(cin>>n && n>=0){
        int f[2]={0,1},a[2][2]={{0,1},{1,1}};
        while(n){
            if(n%2)mul(f,a);
            mulself(a);
            n>>=1;
        }
        cout<<f[0]<<endl;
    }    
}
/*
1 1 2 3 5 8 13 21 34
*/

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10525509.html