宝塔建设网站域名进不去,12个 网站模板 管理办法,公司网站设计好,游戏网页垒骰子 赌圣atm晚年迷恋上了垒骰子#xff0c;就是把骰子一个垒在另一个上边#xff0c;不能歪歪扭扭#xff0c;要垒成方柱体。 经过长期观察#xff0c;atm 发现了稳定骰子的奥秘#xff1a;有些数字的面贴着会互相排斥#xff01; 我们先来规范一下骰子#xff1a;1 …垒骰子 赌圣atm晚年迷恋上了垒骰子就是把骰子一个垒在另一个上边不能歪歪扭扭要垒成方柱体。 经过长期观察atm 发现了稳定骰子的奥秘有些数字的面贴着会互相排斥 我们先来规范一下骰子1 的对面是 42 的对面是 53 的对面是 6。 假设有 m 组互斥现象每组中的那两个数字的面紧贴在一起骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。 两种垒骰子方式相同当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。 由于方案数可能过多请输出模 10^9 7 的结果。 不要小看了 atm 的骰子数量哦 「输入格式」 第一行两个整数 n m n表示骰子数目 接下来 m 行每行两个整数 a b 表示 a 和 b 不能紧贴在一起。 「输出格式」 一行一个数表示答案模 10^9 7 的结果。 「样例输入」 2 1 1 2 「样例输出」 544 「数据范围」 对于 30% 的数据n 5 对于 60% 的数据n 100 对于 100% 的数据0 n 10^9, m 36 资源约定 峰值内存消耗含虚拟机 256M CPU消耗 2000ms 请严格按要求输出不要画蛇添足地打印类似“请您输入...” 的多余内容。 所有代码放在同一个源文件中调试通过后拷贝提交该源码。 注意不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意主类的名字必须是Main否则按无效代码处理。
解析首先分析一下样例输出中544怎么来的题意中指出不同的朝向是不同的结果。所有对于n个骰子来说最终结果就需要再乘上4^n而样例中两个骰子就是4^2544/(4^2) 34而34代表骰子接触的两个面的情况55666634。 下面的代码用到了矩阵快速幂
import java.util.Scanner;public class Main {static final double MOD 10e9-7;static int[][] arr new int[6][6];public static void main(String[] args) {Scanner input new Scanner(System.in);int n input.nextInt();int m input.nextInt();/*** 初始化arr数组* */for (int i 0; i 6; i) {for (int j 0; j 6; j) {arr[i][j] 1;}}for (int i 0; i m; i) {int a input.nextInt();int b input.nextInt();arr[a-1][b-1] 0;arr[b-1][a-1] 0;}int[][] ans pow(arr, n-1);int sum 0;for (int i 0; i 6; i) {for (int j 0; j 6; j) {sum ans[i][j]%MOD;}}/*** 旋转情况 4^n* */sum * Math.pow(4, n)%MOD;System.out.println((int)(sum%MOD));}private static int[][] pow(int[][] arr, int k) {/*** 初始化单位矩阵* */int[][] ans new int[6][6];for (int i 0; i 6; i) {ans[i][i] 1;}/*** 矩阵快速幂核心算法* */while (k ! 0) {if (k % 2 ! 0) {ans Multiply(arr, ans);} else {arr Multiply(arr, arr);}k 1;}return ans;}private static int[][] Multiply(int[][] m, int[][] n) {
// 标准计算矩阵乘法算法int rows m.length;int cols n[0].length;int[][] r new int[rows][cols];for (int i 0; i rows; i) {for (int j 0; j cols; j) {for (int k 0; k m[i].length; k) {r[i][j] (m[i][k] * n[k][j])%MOD;}}}return r;}
}