Description
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
现求第n项的斐波纳契数
Input
第一行一个整数n
Output
输出一个整数,代表第n项的斐波纳契数,由于数据过大,输出结果模123456789
Sample Input
6
Sample Output
8
HINT
对于50%的数据,n < 108
对于100%的数据,n < 1016
#include<stdio.h>
struct Squ
{
long long num[3][3];
}tmp;
long long n;
Squ play(Squ x,Squ y)
{
Squ tmp3;
tmp3.num[1][1]=(x.num[1][1]%123456789*y.num[1][1]%123456789+x.num[1][2]%123456789*y.num[2][1]%123456789)%123456789;
tmp3.num[1][2]=(x.num[1][1]%123456789*y.num[1][2]%123456789+x.num[1][2]%123456789*y.num[2][2]%123456789)%123456789;
tmp3.num[2][1]=(x.num[2][1]%123456789*y.num[1][1]%123456789+x.num[2][2]%123456789*y.num[2][1]%123456789)%123456789;
tmp3.num[2][2]=(x.num[2][1]%123456789*y.num[1][2]%123456789+x.num[2][2]%123456789*y.num[2][2]%123456789)%123456789;
return tmp3;
}
Squ power(Squ x,long long y)
{
if(y==1)
return x;
Squ tmp3=power(x,y/2);
tmp3=play(tmp3,tmp3);
if(y%2)
tmp3=play(tmp3,x);
return tmp3;
}
int main()
{
scanf("%lld",&n);
if(n==1||n==2)
{
printf("1");
return 0;
}
tmp.num[1][1]=1;
tmp.num[1][2]=1;
tmp.num[2][1]=1;
tmp.num[2][2]=0;
Squ tmp3=power(tmp,n-2);
printf("%lld",(tmp3.num[1][1]+tmp3.num[1][2])%123456789);
}