POJ 3070 Fibonacci

和上次那个HDU 一样!

题意很简单:求出指定斐波那契数列的后四位!

数据量很大:

用构造矩阵,矩阵快速幂就行了!mod = 10000!

可能结果不是后四位,那就再取模一次就行了!

# include <iostream>
# include <cmath>
# include <cstring>
# include <cstdio>
using namespace std;
const int maxn = 100 + 1;
typedef unsigned long long llu;
llu mod = 10000;
struct Mar{
   llu mat[2][2];
}E = {1,0,0,1},D = {0,1,1,1};
Mar mul(Mar a, Mar b){
    Mar ans={0,0,0,0};
    for (int i = 0; i <2; ++i)
        for (int j = 0; j < 2; ++j)
            for (int k = 0; k < 2; ++k)
                ans.mat[i][j] += ((a.mat[i][k]%mod) *( b.mat[k][j]%mod)) % mod;
    return ans;
}
Mar pow2(Mar a,llu n){
    Mar ans = E;
    while(n){
        if(n & 1)
            ans = mul(ans,a);
        n/=2;
        a=mul(a,a);
    }
    return ans;
}
int main(void)
{
    int k;
    while(cin >> k && k != -1){
        int ans = pow2(D,k).mat[0][1] %mod;
        cout << ans <<endl;
    }
    return 0;
}


你可能感兴趣的:(C语言,poj)