时间紧张,先记一笔,后续优化与完善。
矩阵减速
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int c[101][3][3],b[3][3],d[3][3],lon;
int n;
void dfs(int k)
{
if(k==1)
{
lon++;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
c[lon][i][j]=b[i][j];
return;
}
dfs(k/2);
memset(d,0,sizeof(d));
for(int p=1;p<=2;p++)
for(int q=1;q<=2;q++)
for(int i=1;i<=2;i++)
{
d[p][q]+=c[lon][p][i]*c[lon][i][q];
d[p][q]%=10000;
}
lon++;
if(k&1)
{
for(int p=1;p<=2;p++)
for(int q=1;q<=2;q++)
for(int i=1;i<=2;i++)
{
每日一道理
水仙亭亭玉立,兰花典雅幽香,牡丹雍容华贵,梨花洁白无暇……美丽的花朵总能得到世人的羡慕与赞叹,殊不知,它从一粒小小的种子到最后开花,要历经无数的艰辛与坎坷!我们的成长也是如此。只有做辛勤的“织梦者”,我们的梦想才会成真!
c[lon][p][q]+=d[p][i]*b[i][q];
c[lon][p][q]%=10000;
}
}
else
{
for(int p=1;p<=2;p++)
for(int q=1;q<=2;q++)
c[lon][p][q]=d[p][q];
}
}
int main()
{
while(scanf("%d",&n),n!=-1)
{
if(n<=2)
{
if(n==0) printf("0\n");
else if(n==1) printf("1\n");
else printf("2\n");
continue;
}
b[1][1]=1;
b[1][2]=1;
b[2][1]=1;
b[2][2]=0;
memset(c,0,sizeof(c));
lon=-1;
dfs(n-2);
int ans=(c[lon][1][1]+c[lon][2][1])%10000;
printf("%d\n",ans);
}
return 0;
}
文章结束给大家分享下程序员的一些笑话语录: 祝大家在以后的日子里. 男生象Oracle般健壮; 女生象win7般漂亮; 桃花运象IE中毒般频繁; 钱包如Gmail容量般壮大, 升职速度赶上微软打补丁 , 追女朋友像木马一样猖獗, 生活像重装电脑后一样幸福, 写程序敲代码和聊天一样有**。