题意:n p
斐波那契数列:0,1,1,2,3,5,8,13……
f[0]=0,f[1]=1……
求f[n]%p;
例:
输入:
0 9997
1 9997
2 9997
输出:
0
1
1
矩阵快速幂。。。
f[n]=f[n-1]+f[n-2];
构造矩阵:
1 1
1 0
http://blog.csdn.net/u010489389/article/details/13730821
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define pi acos(-1.0)
#define e exp(1.0)
#define ll long long
struct node
{
ll a[2][2];
}I,T;
ll n,p;
node cheng(node A,node B)
{
node C;
memset(C.a,0,sizeof(C.a));
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
for(k=0;k<2;k++)
{
C.a[i][j]+=A.a[i][k]*B.a[k][j];
}
C.a[i][j]%=p;
}
return C;
}
int main()
{
while(~scanf("%lld%lld",&n,&p))
{
memset(I.a,0,sizeof(I.a));
I.a[0][0]=1;
I.a[1][1]=1;
memset(T.a,0,sizeof(T.a));
T.a[0][0]=1,T.a[1][0]=1,T.a[0][1]=1;
if(n==0)
printf("0\n");
else if(n==1 && n==2)
printf("%d\n",1%p);
else
{
n-=2;
while(n>0)
{
if(n&1==1)
I=cheng(I,T);
n>>=1;
T=cheng(T,T);
}
ll ans=(I.a[0][0]+I.a[1][0])%p;
printf("%lld\n",ans);
}
}
}