【题目链接】
【算法】
矩阵乘法快速幂
【代码】
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
const long long MOD = 10000;
long long n;
struct Matrix
{
long long n,m;
long long mat[5][5];
} ans;
inline void multipy(Matrix &a,Matrix b)
{
long long i,j,k;
Matrix ans;
ans.n = a.n; ans.m = b.m;
memset(ans.mat,0,sizeof(ans.mat));
for (i = 1; i <= a.n; i++)
{
for (j = 1; j <= b.m; j++)
{
for (k = 1; k <= a.m; k++)
{
ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
}
}
}
a = ans;
}
inline void power(Matrix &a,long long n)
{
Matrix p,ans;
p.n = p.m = 2;
p.mat[1][1] = 1; p.mat[1][2] = 1;
p.mat[2][1] = 1; p.mat[2][2] = 0;
ans.n = ans.m = 2;
ans.mat[1][1] = 1; ans.mat[1][2] = 0;
ans.mat[2][1] = 0; ans.mat[2][2] = 1;
while (n > 0)
{
if (n & 1) multipy(ans,p);
n >>= 1;
multipy(p,p);
}
a = ans;
}
inline void solve()
{
Matrix tmp;
tmp.n = 2; tmp.m = 1;
tmp.mat[1][1] = 1; tmp.mat[2][1] = 0;
ans.n = ans.m = 2;
ans.mat[1][1] = ans.mat[1][2] = ans.mat[2][1] = 1;
ans.mat[2][2] = 0;
power(ans,n-1);
multipy(ans,tmp);
cout<< ans.mat[1][1] << endl;
}
int main()
{
while (scanf("%lld",&n) != EOF && n != -1)
{
if (!n) cout<< 0 << endl;
else if (n == 1) cout<< 1 << endl;
else solve();
}
return 0;
}