若要是直接计算(5+sqrt(24))^n当然不好计算,但可以知道的是(5+sqrt(24))^n+(5-sqrt(24))^n是整数,高中学过的方法化简开即可发现。而且5-sqrt(24)是个小数,所以(5+sqrt(24))^n+(5-sqrt(24))^n再减去1就是要求的答案。
然而,由广义斐波那契可得到:所有的F[n]=p*F[n-1]+q*F[n-2]形式都能与A*x^n+B*y^n形式通过特征方程相互转换
所以可得递推式F[n]=10*F[n-1]-F[n-2]。
又由于广义Fabonacci数列取模拥有循环节,所以求出循环节,对指数取模即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[50000]; //可打表发现最大是46338
unsigned int m,x;
int work(){
f[1]=10%m;
f[2]=98%m;
int i=3;
while(1){
f[i]=(10*f[i-1]-f[i-2]+m)%m;
if(f[i]==f[2]&&f[i-1]==f[1]){
return i-2;
}
i++;
}
}
int quick_mod(int p){
int ans=1;
int a=2;
while(x){
if(x&1){
ans=(ans*a)%p;
}
x>>=1;
a=(a*a)%p;
}
return (f[1+ans]-1)%m;
}
int main()
{
int cs=1;
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&x,&m);
printf("Case #%d: %d\n",cs++,quick_mod(work()));
}
return 0;
}