垒骰子

赌圣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


感觉挺有难度的一题。。。最开始想到了动态规划,发现数据太大。。。

看了题解:博主最初用的常规dp,dp[i][j]:第i层,j点在上面的种数;dp[i][j]=dp[i][j]+dp[i-1][x](x的对面与j不冲突),我最初的想法也跟这个差不多,只是时间复杂度不够。。。

然后看了楼主的第二篇用矩阵快速幂优化的解法,很精辟。http://blog.csdn.net/lonverce/article/details/45169285

可以用矩阵快速幂来优化一些不满足时间复杂度的dp,但是递推式很重要,想不出递推式都是白搭。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
#define MOD 1000000007
#define LL long long
struct Matrix
{int row,col;LL matr[8][8];Matrix() {}Matrix(int r,int c,int num){row=r;col=c;for(int i=1; i<=r; i++)for(int j=1; j<=c; j++)matr[i][j]=num;}
};Matrix matr_multi(Matrix m1,Matrix m2)   //矩阵乘法
{Matrix m3(m1.row,m2.col,0);for(int i=1; i<=m1.row; i++)for(int j=1; j<=m2.col; j++)for(int k=1; k<=m1.col; k++)m3.matr[i][j]=(m3.matr[i][j]+m1.matr[i][k]*m2.matr[k][j])%MOD;return m3;
}void matr_givevalue(Matrix& a,Matrix b)
{a.row=b.row;a.col=b.col;for(int i=1; i<=a.row; i++)for(int j=1; j<=a.col; j++)a.matr[i][j]=b.matr[i][j];
}Matrix matr_pow(Matrix m1,int k)  //矩阵快速幂
{Matrix m2;matr_givevalue(m2,m1);k--;while(k>0){if(k&1)m2=matr_multi(m2,m1);m1=matr_multi(m1,m1);k>>=1;}return m2;
}LL PowMod(LL n,int k)  //常规快速幂
{LL res=1;while(k>0){if(k&1)res=(res*n)%MOD;n=(n*n)%MOD;k>>=1;}return res;
}void matr_output(Matrix m)
{for(int i=1; i<=m.row; i++){for(int j=1; j<=m.col; j++)cout<<m.matr[i][j]<<" ";cout<<endl;}
}
int main()
{Matrix conflict(6,6,1);Matrix m2(1,6,1);int nn,mm;scanf("%d%d",&nn,&mm);for(int i=0; i<mm; i++){int a,b;scanf("%d%d",&a,&b);int bb=b+3,aa=a+3;if(bb>6)bb%=6;if(aa>6)aa%=6;conflict.matr[a][bb]=0;   //设置conflict,这个地方要注意conflict.matr[aa][b]=0;}Matrix m1;m1=matr_pow(conflict,nn-1);m2=matr_multi(m2,m1);LL power=PowMod(4,nn);LL res=0;for(int i=1; i<=6; i++)res=(res+m2.matr[1][i])%MOD;res=(res*power)%MOD;printf("%I64d\n",res);return 0;
}

转载于:https://www.cnblogs.com/jasonlixuetao/p/6491338.html

15年第六届蓝桥杯第九题_(矩阵快速幂优化的动态规划)相关推荐

  1. 第六届蓝桥杯真题总结

    第六届蓝桥杯真题总结 第一题:奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求 ...

  2. 蓝桥杯-蓝跳跳(矩阵快速幂 70%数据)

    蓝桥杯-蓝跳跳(矩阵快速幂 70%数据) 题目描述 小蓝制作了一个机器人,取名为蓝跳跳,因为这个机器人走路的时候基本靠跳跃. 蓝跳跳可以跳着走,也可以掉头.蓝跳跳每步跳的距离都必须是整数,每步可以跳不 ...

  3. 第六届蓝桥杯JavaC组_垒骰子_详解

    视频地址: https://www.bilibili.com/video/BV1GT4y1S7ms 题目: 垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱 ...

  4. 第九届蓝桥杯真题解析JavaC组

    第九届蓝桥杯真题解析JavaC组 文章目录 ***第九届蓝桥杯真题解析JavaC组*** 前言 A.哪天回家 B.猴子分香蕉 C.字母阵列 D.第几个幸运数 E.书号验证 F.打印大X G.缩位求和 ...

  5. 第六届蓝桥杯大赛个人赛决赛(C/C++大学B组)

    第六届蓝桥杯大赛个人赛决赛(C/C++大学B组) 第一题 积分之迷(15分) 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单 ...

  6. 2015年第六届蓝桥杯C/C++B组省赛题目解析

    1.奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是 ...

  7. 2015第六届蓝桥杯全国软件大赛省赛(预赛)总结

    这是我上大学以来第一次自发的写总结,这也许意味着我对大学的看法和接下来的大学生活都将有所改变吧.首先说说引导我写这篇总结的"人物"吧,RUI,从大一开始便是同学,直到大三成为了舍友 ...

  8. 【蓝桥杯】第六届蓝桥杯大赛个人赛省赛(软件类) Java大学C组 -题目与答案

    第六届蓝桥杯大赛个人赛省赛(软件类) Java大学C组 -题目与答案 1.结果填空(满分3分) 2.结果填空(满分5分) 3.结果填空(满分9分) 4.代码填空(满分11分) 5.代码填空(满分15分 ...

  9. [第六届蓝桥杯省赛C++B组]三羊献瑞

    题目来源:第六届蓝桥杯省赛C++B组 算法标签:全排列 题目描述: 观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4 ...

最新文章

  1. Android面试题目之四: 归并排序
  2. python四大软件-Python实用模块(二十)Apscheduler
  3. 八周二次课 rsync工具介绍,常用参数选项以及和ssh同步
  4. bcp文件, 逗号文件
  5. Groovy新手教程
  6. 【机器人】“市场很冷,从业者很拼” | 众多国内机器人厂商热议当前市场状态|人工智能...
  7. c语言自动变量与静态变量,C语言的中的静态变量和局部变量(自动变量)
  8. python类中self关键字用法
  9. 每日长难句打卡Day22
  10. 谁先看到苏神咬人? 世界杯直播背后的云
  11. iphone 开发设置tableview 初始位置。
  12. Terraform 支持自动化开通阿里云产品
  13. 估计很多人不知道:在PowerPoint中插入图片的三种方式用法和解析
  14. 联想H61主板升级BIOS,支持nvme硬盘
  15. 雷诺rarone机械手表日期怎么调?
  16. Python 转换金额数字大写为数字小写
  17. warning: LF will be replaced by CRLF in The file will hav
  18. c++ break语句
  19. 摩托罗拉ME525搜索键改锁屏键
  20. 大学生计算机专业英文求职,计算机专业大学生英文求职信范文

热门文章

  1. python五十:反射
  2. Java拾遗:001 - 重写 equals 和 hashCode 方法
  3. oracle 打印SQL
  4. AutoMySQLBackup 3.0 Bug:du: WARNING: use --si, not -H
  5. 源路由 就是指定数据传输经过这个路由服务器
  6. 如何使用Quagga,将你的CentOS设备变成OSPF路由器
  7. WPF-13:资源文件需要手动引用问题
  8. 戴尔推免费浏览器安全工具 可隔离恶意软件
  9. contos 安装vim自动补全插件 YCM YouCompleteMe
  10. 百度资源管理平台 站长工具 批量添加主站域名 子站域名 域名主动推送