#include<stdio.h>
#define N 3
__int64 map[N][N],tmp1[N][N],tmp2[N][N];
void fun(__int64 map[N][N],int n,int k)//求矩阵map的k次幂,n代表每一维的数据个数
{
int i,j,m;
k--; //求map的k次幂,那map还需乘以map的k-1次幂
for(i=1;i<=n;i++) //初始化tmp1数组,tmp1数组记录的是map的2^x次幂
for(j=1;j<=n;j++)
tmp1[i][j]=map[i][j]%10000;
while(k)
{
if(k%2)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
tmp2[i][j]=map[i][j]%10000;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
map[i][j]=0;
for(m=1;m<=n;m++)
{
map[i][j]=(map[i][j]+tmp2[i][m]*tmp1[m][j])%10000;
}
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
tmp2[i][j]=tmp1[i][j]%10000;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
tmp1[i][j]=0;
for(m=1;m<=n;m++)
tmp1[i][j]=(tmp1[i][j]+tmp2[i][m]*tmp2[m][j])%10000;
}
k=k/2;
}
}
int main()
{
int n;
while(scanf("%d",&n),n!=-1)
{
if(n==0||n==1)
{
printf("%d\n",n);
continue;
}
map[1][1]=map[1][2]=map[2][1]=1;
map[2][2]=0;
fun(map,2,n-1);
printf("%I64d\n",map[1][1]);
}
return 0;
}
poj 3070
最新推荐文章于 2022-04-19 20:43:25 发布