#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=0;
bool f=0;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<0)
{
putchar('-'); x=-x;
}
if(x<10)
{
putchar(x+'0'); return;
}
write(x/10);
putchar((x%10)+'0');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int Mod=10000;
int n;
int ans[5][5],power[5][5],a[5][5],c[5][5];
inline void Ad(int &x,int y)
{
x+=y;
x-=(x>=Mod)?Mod:0;
return;
}
int main()
{
while(true)
{
int i,j,k;
R(n);
if(n==-1) break;
if(n==0) {puts("0"); continue;}
n--;
ans[1][1]=1; ans[1][2]=0;
power[1][1]=power[2][2]=1; power[1][2]=power[2][1]=0;
a[1][1]=a[1][2]=a[2][1]=1; a[2][2]=0;
while(n)
{
if(n&1)
{
memset(c,0,sizeof c);
for(i=1;i<=2;i++) for(j=1;j<=2;j++) for(k=1;k<=2;k++)
{
Ad(c[i][j],power[i][k]*a[k][j]%Mod);
}
memmove(power,c,sizeof power);
}
memset(c,0,sizeof c);
for(i=1;i<=2;i++) for(j=1;j<=2;j++) for(k=1;k<=2;k++)
{
Ad(c[i][j],a[i][k]*a[k][j]%Mod);
}
memmove(a,c,sizeof a);
n>>=1;
}
memset(c,0,sizeof c);
for(i=1;i<=1;i++) for(j=1;j<=2;j++) for(k=1;k<=2;k++)
{
Ad(c[i][j],ans[i][k]*power[k][j]%Mod);
}
memmove(ans,c,sizeof ans);
Wl(ans[1][1]);
}
return 0;
}
一本通1645:Fibonacci
最新推荐文章于 2025-05-16 14:00:49 发布