题意:
递归求斐波那契数列,求递归次数,即节点个数
思路:
我们分析可以得到递归次数同样是前两个答案的和加1
ans[i] =ans[i-1]+ans[i-2]+1
1 , 1, 3,5,9,15,25。。。。。
同时又发现 ans[i]是第i个斐波那契数的两倍减1
#include<bits/stdc++.h>
using namespace std;
long long N;
struct node
{
long long a[2][2];
};
const node A={
{ 1,1
,1,0
}
};
const node B={
{1,1
,0,0
}
};
node cheng(node a,node b)
{
node c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%N)%N;
}
return c;
}
int main()
{
long long t,n;
int k=1;
node a,b;
while(~scanf("%lld%lld",&n,&N),n+N)
{
t=n;
a=A;
b=B;
if(n==0) b.a[0][0]=1;
else
{
n--;
while(n)
{
if(n&1) b=cheng(b,a);
a=cheng(a,a);
n>>=1;
}
}
printf("Case %d: %lld %lld %lld\n",k++,t,N,((2*b.a[0][0]-1)%N+N)%N);
}
return 0;
}