标签:垒骰子
垒骰子注意:主类的名字必须是:Main,否则按无效代码处理。
解题思路: DP问题,但是只能过部分数据。先搁置一下会。
import java.math.BigInteger;
import java.util.Scanner;
public class Main
{
	public static final int MOD = 1000000007;      
	public static int init[] = {-1, 4, 5, 6, 1, 2, 3};      // 骰子对面
	public static boolean conflict[][] = new boolean[7][7]; // 冲突
	
	public static void main(String[] args)
	{
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        for (int i = 0; i < m; i++)
        {
        	int a = sc.nextInt();
        	int b = sc.nextInt();
            conflict[a][b] = conflict[b][a] = true;
        }
        
        // dp[i][j] 代表,i个骰子且最顶面是j的情况种数   并且使用了滚动dp,否则会超空间        
        BigInteger dp[][] = new BigInteger[2][7];
        int e = 0;
        for (int i = 1; i < 7; i++) dp[e][i] = BigInteger.ONE;
        
        for (int i = 2 ; i <= n; i++)
        {
        	e = 1-e;
        	for (int j = 1; j < 7; j++)
        	{
        		dp[e][j] = BigInteger.ZERO;
        	   	for (int k = 1; k < 7; k++)
        	   	{
        	   		if (!conflict[init[j]][k])
        	   			dp[e][j] = dp[e][j].add(dp[1-e][k]).mod(new BigInteger(MOD+""));
        	   	}
        	}
        }
        
        BigInteger sum = BigInteger.ZERO;
        for (int i = 1; i < 7; i++)
        {
        	sum = sum.add(dp[e][i]).mod(new BigInteger(MOD+""));
        }
        System.out.println(sum.multiply(quickpow(4, n)).mod(new BigInteger(MOD+"")));
	}
	
	//快速幂
	static BigInteger quickpow(int n, int m)
	{
		BigInteger n1 = new BigInteger(n+"");
		
		BigInteger t = BigInteger.ONE;
		while(m > 0)
		{
			if ((m & 1) == 1) t = t.multiply(n1).mod(new BigInteger(MOD+""));
			n1 = n1.multiply(n1).mod(new BigInteger(MOD+""));
			m >>= 1;
		}
		return t;
	}
}标签:垒骰子
原文地址:http://blog.csdn.net/first_sight/article/details/45560789