和上次那个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;
}