题目链接:How Many Calls? UVA - 10518
题目大意:求斐波那契数列第n个数的递归次数,然后再模除b。
n比较大,可以借助矩阵快速幂来求斐波那契数列的第n项。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
struct Matrix{
LL s[2][2];
Matrix(LL a=0,LL b=0,LL c=0,LL d=0)
{
s[0][0]=a,s[0][1]=b;
s[1][0]=c,s[1][1]=d;
}
};
Matrix multi(Matrix a,Matrix b,int mod)
{
Matrix ans;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
ans.s[i][j]=(a.s[i][0]*b.s[0][j]+a.s[i][1]*b.s[1][j])%mod;
return ans;
}
Matrix quick_pow(LL n,int mod)
{
Matrix ans(1,0,0,1),a(1,1,1,0);
while(n)
{
if(n&1)
ans=multi(ans,a,mod);
n>>=1;
a=multi(a,a,mod);
}
return ans;
}
int main()
{
LL n;
int casenum=1,b;
while(~scanf("%lld%d",&n,&b)&&(n||b))
{
Matrix ans=quick_pow(n,b);
printf("Case %d: %lld %d %lld\n",casenum++,n,b,((ans.s[0][0]<<1)-1+b)%b);
}
return 0;
}