题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4990
矩阵快速幂。
将even与odd分开讨论。
当 n为even,可以推出 f[n]=4*f[n-2]+2;
为odd,可以推出f[n]=4*f[n-2]+1;
接下来就很简单了;
ac code:
#include
using namespace std;
typedef long long LL;
LL n,m;
LL con[3][3]={4,2,0, 0,1,0, 0,2,4};
struct matrix{
LL s[3][3];
matrix(){};
matrix(LL a[3][3])
{
for(int i=0;i<3;++i)
{
for(int j=0;j<3;++j)
s[i][j]=a[i][j];
}
}
};
matrix matrix_mul(matrix a,matrix b)
{
matrix ans;
for(int i=0;i<3;++i)
{
for(int j=0;j<3;++j)
{
ans.s[i][j]=0;
for(int k=0;k<3;++k)
{
ans.s[i][j]=(ans.s[i][j]+a.s[i][k]*b.s[k][j]%m)%m;
}
}
}
return ans;
}
matrix matrix_pow(LL k)
{
matrix ans;
LL ren[3][3]={1,0,0, 0,1,0, 0,0,1};
ans= matrix (ren);
matrix a(con);
while(k)
{
if(k&1)ans=matrix_mul(ans,a);
k>>=1;
a=matrix_mul(a,a);
}
return ans;
}
int main()
{
LL x,y,z;
LL k;
while(cin>>n>>m)
{
if(n&1)
{
x=5,y=1,z=1;
con[0][1]=con[2][1]=1;
k=(n+1)/2;
}
else
{
x=10,y=1,z=2;
con[0][1]=con[2][1]=2;
k=n/2;
}
if(k==1)cout<