垒骰子(经典递推、矩阵快速幂)
2017-09-06 22:30
375 查看
problem
赌圣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 11 2
「样例输出」
544「数据范围」
对于 30% 的数据:n <= 5 对于 60% 的数据:n <= 100对于 100% 的数据:0 < n <= 10^9, m <= 36
思路
重点是利用相对的面构造转移矩阵, 1个数字向下的状态有 4种。分别存储1朝上,2朝上…6朝上时的种数
递推关系和相邻限制有关,根据限制构造转移矩阵
具体见代码
代码示例
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1e9+7; const int maxn=7; struct matrix{ ll a[maxn][maxn]; }; int Hash[7]; matrix unit() { matrix m; for(int i=0;i<maxn;++i){ for(int j=0;j<maxn;++j){ if(i==j) m.a[i][j]=1; else m.a[i][j]=0; } } return m; } matrix matrix_mul(matrix A,matrix B) { matrix c; for(int i=0;i<maxn;++i){ for(int j=0;j<maxn;++j){ c.a[i][j]=0; for(int k=0;k<maxn;++k){ c.a[i][j]=(c.a[i][j]+(A.a[i][k]*B.a[k][j])%mod)%mod; } } } return c; } matrix matrix_pow(matrix A,int b) { matrix res=unit(); while(b) { if(b&1) res=matrix_mul(res,A); A=matrix_mul(A,A); b>>=1; } return res; } int main() { ios::sync_with_stdio(false); ll n,m; cin>>n>>m; matrix ans,chu,fu; //初值 memset(chu.a,0,sizeof(chu.a)); for(int i=1;i<maxn;++i) chu.a[i][1]=4; //辅助 memset(fu.a,0,sizeof(fu.a)); for(int i=1;i<maxn;++i){ for(int j=1;j<maxn;++j){ fu.a[i][j]=4; } } Hash[1]=4; Hash[2]=5; Hash[3]=6; Hash[4]=1; Hash[5]=2; Hash[6]=3; int a,b; for(int i=0;i<m;++i){ cin>>a>>b; fu.a[Hash[a]][b]=0; fu.a[Hash[b]][a]=0; } ans=matrix_mul(matrix_pow(fu,n-1),chu); ll xiang=0; for(int i=1;i<maxn;++i){ xiang=(xiang+ans.a[i][1])%mod; } cout<<xiang<<endl; return 0; }
相关文章推荐
- hrbust/哈理工oj 1126 Final Destination II【矩阵快速幂+递推】
- hdu4565(矩阵快速幂+经典的数学处理)
- HDU 5667 矩阵快速幂关于指数的递推
- POJ 3070 矩阵经典6 最基础的Fibonacci递推
- nyoj301递推求值【矩阵快速幂】
- POJ 3420 Quad Tiling 线性递推 矩阵快速幂
- 2017年浙江工业大学大学生程序设计迎新赛热身赛-E:递推(矩阵快速幂)
- hdu 5950 Recursive sequence(递推 快速幂矩阵)
- hdu2604(递推,矩阵快速幂)
- 算法提高 递推求值 (矩阵快速幂)
- 矩阵快速幂的应用——优化递推过程
- HDU5667 sequence 递推求值 (矩阵快速幂)
- Queuing(矩阵快速幂(递推and模板))
- [Lonlife1031]Bob and Alice are eating food(递推,矩阵快速幂)
- 第六届蓝桥杯——垒骰子(矩阵快速幂)
- HDU 2842 Chinese Rings(矩阵快速幂+递推)
- 【矩阵快速幂】经典题 hdu2157 how many ways、woj642 Lost In WHU
- nyoj--301--递推求值(经典矩阵运算)
- hdu 4602 递推关系矩阵快速幂模
- 第六届蓝桥杯【省赛试题9】垒骰子 ( 矩阵快速幂 )