http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1317
简单的矩阵连乘 要用到大整数 所以用java
代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static int M=(1<<5);
public static int [][] ma = new int[M][M];
public static int [][] mb = new int[M][M];
public static int [][] mc = new int[M][M];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int T=in.nextInt();
while((T--)>0){
BigInteger n;
int m,p;
n=in.nextBigInteger();
m=in.nextInt();
p=in.nextInt();
int h=(1<<m);
for(int i=0;i<h;++i){
for(int j=0;j<h;++j){
mb[i][j]=Fok(i,j,m);
}
}
for(int i=0;i<h;++i){
ma[0][i]=1;
}
n=n.subtract(BigInteger.ONE);
while(n.compareTo(BigInteger.ZERO)==1){
if(n.mod(BigInteger.ONE.add(BigInteger.ONE)).compareTo(BigInteger.ONE)==0){
matrixMul(ma,mb,1,h,p);
}
n=n.divide(BigInteger.ONE.add(BigInteger.ONE));
matrixMul(mb,mb,h,h,p);
}
int ans=0;
for(int i=0;i<h;++i){
ans=(ans+ma[0][i])%p;
}
System.out.println(ans);
if(T>0){
System.out.println();
}
}
}
public static void matrixMul(int [][]a,int [][]b,int n,int m,int p){
for(int i=0;i<n;++i)
for(int j=0;j<m;++j){
int tmp=0;
for(int l=0;l<m;++l){
tmp=(tmp+a[i][l]*b[l][j])%p;
}
mc[i][j]=tmp;
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
a[i][j]=mc[i][j];
}
public static int Fok(int l,int r,int m)
{
int []a=new int[10];
int []b=new int[10];
int k=0;
while(l>0){
a[k++]=(l&1);
l=l>>1;
}
k=0;
while(r>0){
b[k++]=(r&1);
r=r>>1;
}
for(int i=1;i<m;++i){
if(a[i]==0&&b[i]==0&&a[i-1]==0&&b[i-1]==0)
return 0;
if(a[i]==1&&b[i]==1&&a[i-1]==1&&b[i-1]==1)
return 0;
}
return 1;
}
}