zoukankan      html  css  js  c++  java
  • zoj 2317 Nice Patterns Strike Back 夜

    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;
    	}
    
    }
    

      

  • 相关阅读:
    洛谷P1199三国游戏
    Cracking the Coding Interview 6.2
    Cracking the Coding Interview 5.2
    Cracking the Coding Interview 5.7
    洗牌算法
    字符串排列组合问题
    指针作为形参
    KMP算法代码
    搜索二叉树
    面试题集锦
  • 原文地址:https://www.cnblogs.com/liulangye/p/3045445.html
Copyright © 2011-2022 走看看