「模拟8.21」山洞(矩阵优化DP)
暴力:
正解:
考虑循环矩阵,f[i][j]表示从i点到j点的方案数
我们发现n很小,我们预处理出n次的f[i][j]
然后在矩阵快速幂中,我们要从当前的f[i][j]*f[j][k]-->fir[i][j]
但是此时的循环为三层
我们考虑转移式子的意义在0-n次从i-j,在n+1到2×n转移至j
这样此时的j-k其实可以把他看作从0开始走j-k步本质上是一样的
然后还有一个特判,就不讲了
for(int j=0;j<n;++j)
{
ff[now][j]=(ff[now][j]+ff[last][((j-i)+n)%n])%mod;
if((((j-i)+n)%n)==(j+i)%n)continue;
ff[now][j]=(ff[now][j]+ff[last][(j+i)%n])%mod;
}
代码
1 #include<bits/stdc++.h>
2 #define int long long
3 #define MAXN 4001
4 using namespace std;
5 int c[MAXN],f[MAXN],fir[MAXN];
6 int n,m;
7 const int mod=1e9+7;
8 void cheng(int k)
9 {
10 memset(c,0,sizeof(c));
11 if(k==1)
12 {
13 for(int i=0;i<n;++i)
14 {
15 for(int j=0;j<n;++j)
16 {
17 c[(i+j)%n]=(c[(i+j)%n]+f[j]*f[i]+mod)%mod;
18 //if(i*2==(j+i)%n)continue;
19 }
20 }
21 for(int i=0;i<n;++i)f[i]=c[i]%mod;
22 }
23 else
24 {
25 for(int i=0;i<n;++i)
26 {
27 for(int j=0;j<n;++j)
28 {
29 c[(i+j)%n]=(c[(i+j)%n]+fir[j]*f[i]+mod)%mod;
30 //if(i*2==((j+i)%n))continue;
31 }
32 }
33 for(int i=0;i<n;++i)fir[i]=c[i]%mod;
34 }
35 }
36 void poww(int y)
37 {
38 fir[0]=1ll;
39 while(y)
40 {
41 if(y&1ll)cheng(2ll);
42 cheng(1ll);
43 y>>=1ll;
44 }
45 }
46 int ff[4ll][MAXN];int g[MAXN];
47 int now,last;int ans[MAXN];
48 signed main()
49 {
50 //freopen("text.in","r",stdin);
51 //freopen("1.out","w",stdout);
52 scanf("%lld%lld",&n,&m);
53 int now=1;int last=0;
54 ff[0][0]=1;
55 for(int i=1;i<=n;++i)
56 {
57 if(i>1)
58 {
59 swap(now,last);memset(ff[now],0,sizeof(ff[now]));
60 }
61 for(int j=0;j<n;++j)
62 {
63 ff[now][j]=(ff[now][j]+ff[last][((j-i)+n)%n])%mod;
64 if((((j-i)+n)%n)==(j+i)%n)continue;
65 ff[now][j]=(ff[now][j]+ff[last][(j+i)%n])%mod;
66 }
67 if(i==m%n)
68 {
69 for(int j=0;j<n;++j)
70 {
71 g[j]=ff[now][j]%mod;
72 }
73 }
74 if(i==m)
75 {
76 printf("%lld\n",ff[now][0]);
77 return 0;
78 }
79 }
80 for(int i=0;i<n;++i)
81 {
82 f[i]=ff[now][i]%mod;
83 }
84 poww(m/n);
85 for(int i=0;i<n;++i)
86 {
87 for(int j=0;j<n;++j)
88 {
89 //if(i*2==((j+i)%n))continue;
90 ans[(i+j)%n]=(ans[(i+j)%n]+(g[i]*fir[j])%mod+mod)%mod;
91 }
92 }
93 if(m%n)
94 printf("%lld\n",ans[0]%mod);
95 else printf("%lld\n",fir[0]%mod);
96 }
「模拟8.21」山洞(矩阵优化DP)的更多相关文章
- 「模拟赛20181025」御风剑术 博弈论+DP简单优化
题目描述 Yasuo 和Riven对一排\(n\)个假人开始练习.斩杀第\(i\)个假人会得到\(c_i\)个精粹.双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强.基于对方上一次斩杀的假人 ...
- 矩阵优化dp
链接:https://www.luogu.org/problemnew/show/P1939 题解: 矩阵优化dp模板题 搞清楚矩阵是怎么乘的构造一下矩阵就很简单了 代码: #include < ...
- bzoj 3120 矩阵优化DP
我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r ...
- HDU - 2294: Pendant(矩阵优化DP&前缀和)
On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K ki ...
- [六省联考2017]组合数问题 (矩阵优化$dp$)
题目链接 Solution 矩阵优化 \(dp\). 题中给出的式子的意思就是: 求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数. 考虑朴素 \(dp\) ,定义状态 \(f[i][ ...
- loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)
题意 题目链接 Sol 设\(f[i][j]\)表示前\(i\)个位置中,以\(j\)为结尾的方案数. 转移的时候判断一下\(j\)是否和当前位置相同 然后发现可以用矩阵优化,可以分别求出前缀积和逆矩 ...
- 「学习笔记」单调队列优化dp
目录 算法 例题 最大子段和 题意 思路 代码 修剪草坪 题意 思路 代码 瑰丽华尔兹 题意 思路 代码 股票交易 题意 思路 代码 算法 使用单调队列优化dp 废话 对与一些dp的转移方程,我们可以 ...
- 洛谷P3193 GT考试 kmp+矩阵优化dp
题意 求\(N\)位数字序列(可以有前导0)中不出现某\(M\)位子串的个数,模\(K\). \(N<=10^9,M<=20,K<=1000\) 分析 设\(dp[i][j]\)表示 ...
- [Sdoi2017]序列计数 矩阵优化dp
题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4818 思路 先考虑没有质数限制 dp是在同余系下的,所以\(f[i][j]\)表示前i个点, ...
随机推荐
- Zoho Projects助力企业项目高效管理
挑选项目管理工具,就和人买衣服.买鞋子是一样的,除了看外观,最重要的是合适.随着项目管理工具的不断发展,市面上有很多工具都非常优秀,也能解决企业.团队的实际需求. 对于项目管理来说,最重要的在于人员协 ...
- [MySQL数据库之事务、读现象、数据库锁机制、多版本控制MVCC、事务隔离机制]
[MySQL数据库之事务.读现象.数据库锁机制.多版本控制MVCC.事务隔离机制] 事务 1.什么是事务: 事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻 ...
- 《前端运维》一、Linux基础--02用户与权限
其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的. 上一篇文章我们学习了基本的指令和vim编辑器的操作方法.这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识. 一.用户与用户组 ...
- MSSQL·备份数据库中的单表
阅文时长 | 0.11分钟 字数统计 | 237.6字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·备份数据库中的单表』 编写人 | SCscHero 编写时间 | 20 ...
- 通过Cloudflare开启全站https
Cloudflare 添加域名后,会自动生成通用证书,快速开启全站HTTPS,服务端不用做任何修改,还可以选择多种开启模式 一.注册Cloudflare账号 直接打开网站:https://www.cl ...
- Jekyll+GitHub Pages部署自己的静态Blog
混了这么久,一直想拥有自己的博客,通过jekyll和GitHub Pages捣腾出了自己的博客(https://www.ichochy.com) 一.安装jekyll 首先有安装Ruby的开发环境 运 ...
- ES6中的展开运算符和解构对象
let obj = { a:1 b:2 } let obj2 = { ...obj c:3 d:4 } console.log(obj2)//1,2,3,4,对象展开 //常考题目 let a = 1 ...
- Win10开启移动热点
Win10开启移动热点 禁用 无线网卡 启动 无线网卡
- 032.Python魔术方法__new__和单态模式
一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...
- 程序"三高"解决方案
0. 程序三高 1. 缓存 2. 预处理和延后处理 3. 池化 3.1 内存池 3.2 线程池 3.3 连接池 4. 异步(回调) 5. 消息队列 5.1 服务解耦 5.2 异步处理 5.3 流量削峰 ...