这个题构造矩阵这里就不讲了,详情见hdu-2256
这个题由于太大了,所以根本没法做,于是就想去寻找循环节
这里先说下方法,不说为什么(因为我也没弄懂QAQ)
循环节就是mod*mod-1,这样把指数模掉这个循环节就好啦,也算是降幂了
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long int ll;
int t;
ll mod,x;
ll s[2][2];
void mult(ll a[][2],ll b[][2])
{
ll c[2][2]= {0,0,0,0};
for(int k=0; k<2; k++)
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
c[i][j]=(c[i][j]+a[i][k]*b[k][j]%mod)%mod;
memcpy(a,c,sizeof(c));
}
void quick(ll x)
{
ll T[2][2]= {5,12,2,5};
while(x)
{
if(x%2) mult(s,T);
mult(T,T);
x/=2;
}
}
ll quick_pow(ll a,ll b, ll mod)
{
ll res=1;
while(b)
{
if(b%2) res=res*a%mod;
a=a*a%mod;
b/=2;
}
return res;
}
int main()
{
scanf("%d",&t);
for(int k=1; k<=t; k++)
{
scanf("%lld%lld",&x,&mod);
ll M=mod*mod-1;
ll n=quick_pow(2,x,M)+1;
s[0][0]=s[1][1]=1;
s[0][1]=s[1][0]=0;
quick(n-1);
ll A=(s[0][0]*5%mod+s[0][1]*2%mod)%mod;
printf("Case #%d: %lld\n",k,(A*2-1)%mod);
}
return 0;
}
这里记一个传送门:(' ')