How Many Calls? UVA - 10518
题意:求f(n)的递归调用次数,用输出base进制的最后一个数。
思路:f(0)=1,f(1)=1,f(n)=f(n-1)+f(n-2)+1;
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll mod;
struct matrix{
ll x[3][3];
};
matrix multi(matrix a,matrix b){
matrix temp;
memset(temp.x,0,sizeof(temp.x));
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
{
temp.x[i][j]+=a.x[i][k]*b.x[k][j];
temp.x[i][j]%=mod;
//if(temp.x[i][j]<0) temp.x[i][j]=(temp.x[i][j]+mod)%mod;
}
return temp;
}
matrix quick_multi(matrix a,ll n)//矩阵快速幂
{
matrix temp=a;
n--;
while(n){
if(n&1)
temp=multi(temp,a);
a=multi(a,a);
n>>=1;
}
return temp;
}
/*void p(matrix a)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
printf("%lld ",a.x[i][j]);
printf("\n");
}
}*/
int main()
{
ll n,kcase=0;
while(scanf("%lld%lld",&n,&mod)!=EOF&&(n||mod))
{
printf("Case %lld: %lld %lld ",++kcase,n,mod);
matrix A,B;
if(n<=1) n==1?printf("1\n"):printf("1\n");
else
{
memset(A.x,0,sizeof(A.x));
memset(B.x,0,sizeof(B.x));
A.x[0][0]=A.x[0][1]=A.x[0][2]=1;
A.x[1][0]=A.x[2][2]=1;
B.x[0][0]=B.x[1][0]=B.x[2][0]=1;
A=quick_multi(A,n-1);
B=multi(A,B);
printf("%lld\n",B.x[0][0]%mod);
}
}
return 0;
}