在斐波那契数列中,Fib0=0,Fib1=1,Fibn=Fibn−1+Fibn−2(n>1)。
给定整数 n,求 Fibnmod10000。
输入格式
输入包含多组测试用例。
每个测试用例占一行,包含一个整数 n。
当输入用例 n=−1 时,表示输入终止,且该用例无需处理。
输出格式
每个测试用例输出一个整数表示结果。
每个结果占一行。
数据范围
0≤n≤2×109
```cpp
#include<iostream>
#include<cstring>
using namespace std;
const int mod=10000;
void mul(int a[],int b[][2],int c[])
{
int tmp[2]={0};
for(int k=0;k<2;++k)
for(int j=0;j<2;++j)
tmp[j] =(tmp[j]+a[k]*b[k][j])%mod;
memcpy(c,tmp,sizeof tmp);
}
void mulself(int a[][2],int b[][2],int c[][2])
{
int tmp[2][2]={0};
for(int k=0;k<2;++k)
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
tmp[i][j] =(a[i][k]*b[k][j]+tmp[i][j])%mod;
memcpy(c,tmp,sizeof tmp);
}
void qmi(int n)
{
int f[2]={0,1};
int tran[2][2] = {{0,1},{1,1}};
while(n)
{
if(n&1)mul(f,tran,f);
mulself(tran,tran,tran);
n>>=1;
}
cout<<f[0]<<endl;
}
int main()
{
int n;
while(cin>>n&&n!=-1)
{
qmi(n);
}
}