赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
  经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
  我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 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

  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

  注意: main函数需要返回0
  注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
  注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

  提交时,注意选择所期望的编译器类型。

1.dp数组实现

这种方法只能过8个测试点,因为超时,注意各个数组下标的含义和起始位置。

import java.sql.Array;
import java.util.*;
import java.awt.print.Printable;
import java.lang.*;public class test2 {/*** 矛盾数组,从下标1开始使用,如果矛盾则为-1,否则为1*/static int[][] md; // 矛盾数组/*** dp[i][j]数组的含义是第i个骰子时,j面朝下的的骰子摆法有多少种,此时不包括转向的情况*/static long[][] dp; // dp数组/*** 骰子的点数的对立面,下标为0不使用*/static int[] xd = new int[7]; // 存储的骰子的相对面static int mod = 1000000000 + 7;static long C=4;public static void main(String[] arge) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();// 色子int m = scanner.nextInt();// 冲突对xd = new int[]{0, 4, 5, 6, 1, 2, 3};md = new int[7][7];//将md数组(存储冲突数字)for (int i = 0; i < 7; i++) {for (int j = 0; j < md.length; j++) {md[i][j] = -1;}}/*md数组初始化*/for (int i = 0; i < m; i++) {int x = scanner.nextInt();int y = scanner.nextInt();md[x][y] = 1;md[y][x] = 1;}/*dp数组初始化*/dp = new long[n][8];for (int i = 1; i < 7 + 1; i++) {dp[0][i] = 1;}/*开始dp,因为骰子可以转向,所以用C记录到第i个色子时,转向方式有多少种*/for (int i = 1; i < n; i++) {C = C * 4 % mod;for (int j = 1; j < 7; j++) {dp[i][j] = getSum(i, j);}}long sum = 0;for (int i = 1; i < 7; i++) {sum = (sum + (dp[n-1][i] * C)) % mod;}System.out.print(sum);}/** j:是朝下的那个点数*获得dp[i][j]应该存储的数字,根据dp[i-1]计算dp[i][j]* */public static long getSum(int i, int j) {int sum = 0;for (int k = 1; k < 7; k++) {if (md[j][xd[k]] != -1) {continue;}sum += dp[i - 1][k];sum=sum%mod;}return sum%mod;}
}

2.矩阵快速幂

import java.sql.Array;
import java.util.*;
import java.awt.print.Printable;
import java.lang.*;class Main2 {static Matrixm conflict = new Matrixm(6, 6);static int[] xd = new int[7];static int mod = 1000000000 + 7;static long C = 4;public static void main(String[] arge) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();// 色子数int m = scanner.nextInt();// 冲突对xd = new int[]{0, 4, 5, 6, 1, 2, 3};// 冲突数组初始化for (int i = 0; i < conflict.m; i++) {for (int j = 0; j < conflict.n; j++) {conflict.arr[i][j] = 4;}}for (int i = 0; i < m; i++) {int x = scanner.nextInt();int y = scanner.nextInt();conflict.arr[x - 1][xd[y] - 1] = 0;conflict.arr[y - 1][xd[x] - 1] = 0;}conflict = get_power(conflict, n - 1);// 矩阵的n-1个幂×long sum = 0;for (int hang = 0; hang < conflict.m; hang++) {long temp = 0;for (int lie = 0; lie < conflict.n; lie++) {temp += 4 * conflict.arr[hang][lie];temp = temp % mod;}sum += temp;sum = sum % mod;}System.out.println(sum);}/*** 矩阵的快速幂** @param matrixm :服务的矩阵* @param n       :幂* @return :结果*/public static Matrixm get_power(Matrixm matrixm, int n) {Matrixm unit = new Matrixm(6, 6);//获得一个单位矩阵get_identity_martix(unit, 1);while (n != 0) {if ((n & 1) != 0) {// 如果这是 n的二进制串不是0,既是1,则将unit与A相乘unit = get_matrix_multi(unit, matrixm);}matrixm = get_matrix_multi(matrixm, matrixm);n = n >> 1;}return unit;}public static Matrixm get_matrix_multi(Matrixm A, Matrixm B) {Matrixm temp = new Matrixm(A.m, B.n); // 结果矩阵for (int hang = 0; hang < A.m; hang++) { // A矩阵的行for (int lie = 0; lie < B.n; lie++) { // B矩阵的列long res = 0;for (int index = 0; index < A.n; index++) {// 进行相×相加res += (A.arr[hang][index] * B.arr[index][lie]) % mod;res = res % mod;}temp.arr[hang][lie] = res;temp.arr[hang][lie] = temp.arr[hang][lie] % mod;}}return temp;}/*** @param x 单位矩阵的中心线的数字* @return :一个单位矩阵*/public static Matrixm get_identity_martix(Matrixm matrixm, int x) {//Matrixm unity = new Matrixm(6, 6);for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {if (i == j) {matrixm.arr[i][j] = x;continue;}matrixm.arr[i][j] = 0;}}return matrixm;}
}class Matrixm {int m;// 行int n;// 列long[][] arr = new long[6][6];public Matrixm(int m, int n) {this.m = m;this.n = n;}
}

Java实现蓝桥杯 垒骰子---dp动态规划+矩阵快速幂相关推荐

  1. 蓝桥杯垒骰子(动态规划)

    1. 问题描述: 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...

  2. 矩阵快速幂+动态规划=蓝桥杯 垒骰子

    矩阵快速幂+动态规划=蓝桥杯 垒骰子 如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解 题目 分析 看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实 ...

  3. 蓝桥杯 - 垒骰子(动态规划+矩阵快速幂优化)

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  4. 垒骰子(动态规划+矩阵快速幂)

    我看到这道题目的第一想法就是动态规划,设dp[i][j]表示我们枚举了i个骰子且最上面为j的方案数,那么很显然初始化为dp[1][j]=4(j=1~6)(侧面方向不同按照不同方案来计算),递推过程很简 ...

  5. 【POJ - 3744】Scout YYF I(概率dp,矩阵快速幂优化dp)

    题干: 题目大意: 在一条不满地雷的路上(无限长),你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的可能坐标范围:[1,100000000]. 每次前进p的概率前进一步, ...

  6. [CSP-S模拟测试]:涂色游戏(DP+组合数+矩阵快速幂)

    题目描述 小$A$和小$B$在做游戏. 他们找到了一个$n$行$m$列呈网格状的画板.小$A$拿出了$p$支不同颜色的画笔,开始在上面涂色.看到小$A$涂好的画板,小$B$觉得颜色太单调了,于是把画板 ...

  7. bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3932  Solved: 2398 [Submit][Sta ...

  8. 【LOJ #6617】「THUPC 2019」摆家具 / furniture(DP / BSGS / 矩阵快速幂)

    传送门 首先显然k=lognk=lognk=logn 显然对于每个iii我们只用关注有多少位与询问的数字不同 考虑分成两个部分 先对每个数字iii求出与他有jjj位不同的数字价值之和 再求出ttt轮后 ...

  9. [BZOJ4861][Beijing2017]魔法咒语 AC自动机+动态规划+矩阵快速幂

    对忌讳词语构建AC自动机 Fi,j F_{i,j}表示长度为 i i,匹配到AC自动机第jj位的合法串方案数 当状态数少的时候用矩阵转移 #include <bits/stdc++.h> ...

  10. 【蓝桥杯】15年初赛 垒骰子,矩阵快速幂

    题目描述 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 ...

最新文章

  1. C#(asp.net)对字符串的操作公共类(StringUtil.cs)
  2. Linux的top命令
  3. .NET实现SOA(1)
  4. Spring Data REST API集成Springfox、Swagger
  5. java合并list_怎么把两个list合并
  6. 数据可视化机器学习工具在线_为什么您不能跳过学习数据可视化
  7. Qt Console Application 与 Qt GUI Application互转
  8. 训练代码_无需一行代码,完成模型训练和部署,这个AI工具开始公测
  9. Failed building wheel for scandir 解决方案
  10. 让自己的网站变成暗黑模式
  11. 渗透测试面试题汇总(全)
  12. CSS居中对齐、定位的总结
  13. 如何给程序添加数字签名 sign
  14. C#使用NPOI的方式操作Excel复制行
  15. CentOS8配置yum/dnf镜像源
  16. 萨缪尔·莫尔斯,一个种族主义画家是如何窃取了电报发明权的呢?
  17. 每天一个小技巧——网易邮箱配置阿里云企业邮箱配置信息设置
  18. unity2D:对话框Dialog——弹出、渐入渐出
  19. 2019,华为云走出“混沌”
  20. org.springframework.context.annotation.AnnotationConfigApplicationContext has not been refreshed yet

热门文章

  1. 【华为OD机试真题 JS】解压报文
  2. 运算放大器虚短和虚断
  3. 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.11
  4. 关于 java中的换行符
  5. rabbitmq消息队列原理
  6. 【python】面向对象和正则表达式
  7. python dateutil_python时间处理模块dateutil
  8. GAN学习记录(四)——条件生成对抗网络CGAN
  9. 华为交换机常用查询命令
  10. http和https协议下,http可以正常下载,但是https却不能