一个结论,F[i]是第i 个Fibonacci数,若i 是素数,则F[i]也是素数。。。至于为什么,我现在还不晓得。。。呵呵
还有,若a整除x,令m=k*x;则a%m也整除x;
所以这样,不用大数也能搞
#include<iostream>
#include<cstring>
#define mp 16000000
#define N 1300010
#define LL long long
using namespace std;
bool vis[mp]={1,1};
LL prime[N],k,x,m,M;
void initPrime()
{
LL i,j,c=1;
for(i=2;i*i<mp;i++) if(!vis[i])
{
prime[c++]=i;
for(j=i*i;j<mp;j+=i) vis[j]=1;
}
for(;i<mp;i++) if(!vis[i]) prime[c++]=i;
}
struct jz
{
LL a[2][2];
};
jz jzc(jz a,jz b)
{
jz ans;
ans.a[0][0]=(a.a[0][0]*b.a[0][0]%M+a.a[0][1]*b.a[1][0]%M)%M;
ans.a[0][1]=(a.a[0][0]*b.a[0][1]%M+a.a[0][1]*b.a[1][1]%M)%M;
ans.a[1][0]=(a.a[1][0]*b.a[0][0]%M+a.a[1][1]*b.a[1][0]%M)%M;
ans.a[1][1]=(a.a[1][0]*b.a[0][1]%M+a.a[1][1]*b.a[1][1]%M)%M;
return ans;
}
jz get_f(LL n)
{
n--;
jz ans,a;
ans.a[0][0]=ans.a[1][1]=1;
ans.a[0][1]=ans.a[1][0]=0;
a.a[0][0]=a.a[0][1]=a.a[1][0]=1;
a.a[1][1]=0;
while(n)
{
if(n&1) ans=jzc(ans,a);
a=jzc(a,a);
n>>=1;
}
return ans;
}
int main()
{
initPrime();
//int i;M=10007;cout<<vis[M]<<endl;for(i=1;i<=30;i++) cout<<i<<" :"<<get_f(i).a[0][0]<<"-----"<<vis[get_f(i).a[0][0]]<<endl;
int T;
cin>>T;
while(T--)
{
cin>>k>>x>>m;
M=x*m;
LL kx=prime[k];
if(k==1) kx=3;
if(k==2) kx=4;
jz ks=get_f(kx);
LL z1=ks.a[1][0],z2=ks.a[0][0];
while(z2%x)
{
//cout<<"z2="<<z2<<endl;
LL temp=z1;
z1=z2;
z2=(temp+z2)%M;
}
cout<<(z2/x)%m<<endl;
}
return 0;
}