掷骰子

思路

可以先定义一个状态f[i] [j]: 前i个骰子,最后一个面是j的方法数,

肯定超时,然鹅可以混一些分,代码如下

 for(int i=1;i<=6;i++) f[0][i]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=6;j++)
{
for(int k=1;k<=6;k++)
{
int _ops=ops[j];
if(w[_ops][j]) continue;
f[i][j] = (f[i-1][k] + f[i][j]) %mod;
}
}
}

开始考虑优化代码

转移方程中:

f[i] [j] = (0|4)f[i-1] [1] + (0|4)f[i-1] [2] +(0|4)f[i-1] [3] +…

方程形式一样,系数在确定好之后也一样。我们考虑矩阵快速幂来加速。

F=F*A^(n-1)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define mst(s,_s) memset(s, _s, sizeof(s))
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int N = 1e6+100;
int T,n,m;
const int mod=1e9+7;
ll A[10][10];
int op[10];
ll F[10];
void mult(ll c[],ll a[],ll b[][10])
{
ll temp[10]={0};
for(int i=1;i<=6;i++)
{ for(int k=1;k<=6;k++)
{
temp[i]=(temp[i]+a[k]*b[i][k])%mod;
}
}
for(int i=1;i<=6;i++)
c[i]=temp[i];
} void mult(ll c[][10],ll a[][10],ll b[][10])
{
int temp[10][10]={0};
for(int i=1;i<=6;i++)
for(int j=1;j<=6;j++)
{
for(int k=1;k<=6;k++){
temp[i][j] = (temp[i][j] + a[i][k] * b[k][j]) %mod;
//temp[i][j]+=a[i][k]*b[k][j];
}
}
for(int i=1;i<=6;i++)
for(int j=1;j<=6;j++)
c[i][j]=temp[i][j];
} int main() {
cin>>n>>m;
for(int i=1;i<=6;i++)
for(int j=1;j<=6;j++)
A[i][j]=4;
op[1]=4;
op[4]=1;
op[2]=5;
op[5]=2;
op[3]=6;
op[6]=3;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
A[a][op[b]]=0;
A[b][op[a]]=0;
}
for(int i=1;i<=6;i++) F[i]=4; int b=n-1;
while(b)
{
if(b&1) mult(F,F,A);
mult(A,A,A);
b>>=1;
} ll res=0;
for(int i=1;i<=6;i++)
res=(res+F[i])%mod;
cout<<res<<endl; return 0;
}

掷骰子【普通线性DP】【转移方程可以优化为矩阵快速幂】的更多相关文章

  1. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】

    黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...

  2. $bzoj1009-HNOI2008$ $GT$考试 字符串$dp$ 矩阵快速幂

    题面描述 阿申准备报名参加\(GT\)考试,准考证号为\(N\)位数\(x_1,x_2,...,x_n\ (0\leq x_i\leq 9)\),他不希望准考证号上出现不吉利的数字. 他的不吉利数字\ ...

  3. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

  4. bzoj2004 矩阵快速幂优化状压dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...

  5. 2018.10.23 bzoj1297: [SCOI2009]迷路(矩阵快速幂优化dp)

    传送门 矩阵快速幂优化dp简单题. 考虑状态转移方程: f[time][u]=∑f[time−1][v]f[time][u]=\sum f[time-1][v]f[time][u]=∑f[time−1 ...

  6. bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...

  7. POJ 3744 【矩阵快速幂优化 概率DP】

    搞懂了什么是矩阵快速幂优化.... 这道题的重点不是DP. /* 题意: 小明要走某条路,按照个人兴致,向前走一步的概率是p,向前跳两步的概率是1-p,但是地上有地雷,给了地雷的x坐标,(一维),求小 ...

  8. LOJ2325. 「清华集训 2017」小 Y 和恐怖的奴隶主【矩阵快速幂优化DP】【倍增优化】

    LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...

  9. BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*

    BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...

  10. HDU5411——CRB and Puzzle——————【矩阵快速幂优化dp】

    CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

随机推荐

  1. python基础 补漏

    输出 -----------定义变量类型 类型 集合 mongodb的用法和redis差不多一样的 NoSQL 数据库之一 https://www.runoob.com/python3/python- ...

  2. TODO留学小程序,展开,收起失效

    text设置user-select=true后,display: -webkit-box 失效? https://developers.weixin.qq.com/community/develop/ ...

  3. 基于recorder.js H5录音功能

    兼容性 1.Chrome,FF,Edge,QQ,360(注:现有IE和Safari全版本不兼容) 2.其中Chrome47以上以及QQ浏览器强制要求HTTPS的支持 3.请尝试使用FF,Edge,36 ...

  4. 像MIUI一样做Zabbix二次开发(2)——Zabbix与商业及开源产品的比较分析

    Zabbix的特点 Zabbix是一个基于WEB界面的提供分布式系统监控的开源解决方案,通过浏览器监视,做到告警分级处理.网络访问安全可控,该开源平台在全球有广泛的用户基础,他的特点: 开放性:源代码 ...

  5. java 为什么要用补码_Java为什么使用补码进行计算的原因分析

    转自csdn---主要是前面的解释很通俗易懂,后面的没有细看,转过来以后查看方便. 我们主要要解决的问题就是负数的表示,而众所周知,绝对值相等的两个正负数之和为0. 假设我们有正数 0000 0000 ...

  6. C语言学习--常量指针与指针常量

    指针常量 #include<stdio.h> #include<string.h> //常量指针:是一个指针, 定义不用初始化, 能改变指向,但是指向的内容不能被修改 cons ...

  7. P1982 [NOIP2013 普及组] 小朋友的数字 题解

    目录 简单版 题目 code 本题 code 简单版 先要会做这道题 题目 P1115 最大子段和https://www.luogu.com.cn/problem/P1115 这道题其实是动态规划,d ...

  8. golang中自带base64编码和解码

    package main import ( "encoding/base64" "fmt" "log" ) func main() { in ...

  9. 记一次SpringBoot整合Redis的Bug

    SpringBoot整合Redis遇见的坑 <!--Redis配置开始--> <dependency> <groupId>org.springframework.b ...

  10. swagger2入门

    1.引入jar包 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox- ...