Fibonacci n<10^10次方它的后四位

#include <iostream>
#include <cstdio>

using namespace std;

struct M
{
   int	m[4][4];
};

M mul(M a,M b)
{
   M c;
   c.m[0][0]=(a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0])%10000;
   c.m[0][1]=(a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1])%10000;
   c.m[1][0]=(a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0])%10000;
   c.m[1][1]=(a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1])%10000;
   return c;
}

M creatone()
{
	M c;
	c.m[0][0]=1;
	c.m[0][1]=1;
	c.m[1][0]=1;
	c.m[1][1]=0;
    return c;
}

M fibonacci(int k)
{
	if(k==1) return creatone();
	if(k%2==0) 
	{
		M en = fibonacci(k/2);
		return mul(en,en);
	}
	else 
	{
		M en = fibonacci(k/2);
		return mul(mul(en,en),creatone());
	}
	return creatone();
}
void init()
{
     int n;
	 while(cin>>n)
	 {
		if(n==-1)break;
		if(n==0){cout<<0<<endl;continue;}
		M one = fibonacci(n);;
		int value = one.m[0][1];
		cout<<value%10000<<endl;
	 }
}
int main()
{
	init();
	return 0;
}

阅读更多
文章标签: include c
个人分类: ACM
上一篇hdu 1175 其实真的可以不用搜索!!
下一篇Matrix Power Series
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭