「模拟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个点, ...
随机推荐
- cetnos中nmap端口扫描工具的使用
1:安装: yum -y install nmap 2:使用方法: nmap -p 1-65535 1.1.1.1 #扫描1.1.1.1此IP地址的所有端口 nmap -p 80,443 1.1.1. ...
- ubuntu中执行可执行文件时报错“没有那个文件或目录”的解决办法(非权限问题)
问题:可执行文件明明存在,也有可执行权限(x),但执行时就提示"没有那个文件或目录". 原因:这个程序的是32位的程序(比如arm-linux-gcc),而系统是64位的,运行时需 ...
- [bug] Importing maven project 卡在%9不动
参考 Importing maven project 卡在%9不动 https://blog.csdn.net/weixin_43197380/article/details/89220337
- Linux下ftp搭建
FTP服务器搭建教程: https://blog.csdn.net/plssmile/article/details/17061271 https://blog.csdn.net/guofengdid ...
- nohup 命令 2>&1 |tee lmbench.log & 只适用没有需要敲y或x的
nohup make results 2>&1 |tee lmbench.log & nohup 命令 2>&1 |tee lmbench.log & 只适 ...
- python基础之错误、调试(异常处理)
在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的. 有的错误是用户输入造成的,比如让用 ...
- 1.4linux文件和目录常用命令
文件和目录常用命令 目标 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 ...
- python实现给字典添加条目的方法
具体实现方法如下: def addWord(theIndex,word,pagenumber): theIndex.setdefault(word, [ ]).append(pagenumber)#存 ...
- 性能调优必备:NIO的优化实现原理
前言 我们就从底层的网络 I/O 模型优化出发,再到内存拷贝优化和线程模型优化,深入分析下 Tomcat.Netty 等通信框架是如何通过优化 I/O 来提高系统性能的. 网络 I/O 模型优化 网络 ...
- 再见Xshell、Xftp!Python执行Linux命令、上传下载远程文件
相信大家应该都接触过Linux操作系统(Ubuntu.Centos等),那么在使用的Linux操作系统需要使用一些远程ssh工具,尤其是公网服务器. 常用的ssh工具主要有:Xshell.MobaXt ...