暴力:

正解:

考虑循环矩阵,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)的更多相关文章

  1. 「模拟赛20181025」御风剑术 博弈论+DP简单优化

    题目描述 Yasuo 和Riven对一排\(n\)个假人开始练习.斩杀第\(i\)个假人会得到\(c_i\)个精粹.双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强.基于对方上一次斩杀的假人 ...

  2. 矩阵优化dp

    链接:https://www.luogu.org/problemnew/show/P1939 题解: 矩阵优化dp模板题 搞清楚矩阵是怎么乘的构造一下矩阵就很简单了 代码: #include < ...

  3. bzoj 3120 矩阵优化DP

    我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r ...

  4. HDU - 2294: Pendant(矩阵优化DP&前缀和)

    On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K ki ...

  5. [六省联考2017]组合数问题 (矩阵优化$dp$)

    题目链接 Solution 矩阵优化 \(dp\). 题中给出的式子的意思就是: 求 nk 个物品中选出 mod k 为 r 的个数的物品的方案数. 考虑朴素 \(dp\) ,定义状态 \(f[i][ ...

  6. loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)

    题意 题目链接 Sol 设\(f[i][j]\)表示前\(i\)个位置中,以\(j\)为结尾的方案数. 转移的时候判断一下\(j\)是否和当前位置相同 然后发现可以用矩阵优化,可以分别求出前缀积和逆矩 ...

  7. 「学习笔记」单调队列优化dp

    目录 算法 例题 最大子段和 题意 思路 代码 修剪草坪 题意 思路 代码 瑰丽华尔兹 题意 思路 代码 股票交易 题意 思路 代码 算法 使用单调队列优化dp 废话 对与一些dp的转移方程,我们可以 ...

  8. 洛谷P3193 GT考试 kmp+矩阵优化dp

    题意 求\(N\)位数字序列(可以有前导0)中不出现某\(M\)位子串的个数,模\(K\). \(N<=10^9,M<=20,K<=1000\) 分析 设\(dp[i][j]\)表示 ...

  9. [Sdoi2017]序列计数 矩阵优化dp

    题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4818 思路 先考虑没有质数限制 dp是在同余系下的,所以\(f[i][j]\)表示前i个点, ...

随机推荐

  1. python-内置函数-callable,chr,ord,bytes,随机验证码生成

    s="老男人" bytes(s,encoding="utf-8") 随机验证码的实现方法: 大写字母: li = [] for i in range(6): t ...

  2. CVPR2021| TimeSformer-视频理解的时空注意模型

    前言: transformer在视频理解方向的应用主要有如下几种实现方式:Joint Space-Time Attention,Sparse Local Global Attention 和Axial ...

  3. Linux系统运行netstat命令时的过三关斩一将

    1.简介 这篇文章主要是记录在日常工作中遇到的一些问题,将其都总结整合到一起,方便查看,提高工作效率.小伙伴们看到标题可能觉得奇怪,不是过五关斩六将而是过三关斩一将.慢慢地往后看发现其中奥秘. 2.过 ...

  4. MySQL如何快速插入数据

    前言: 日常学习和工作中,经常会遇到导数据的需求.比如数据迁移.数据恢复.新建从库等,这些操作可能都会涉及大量数据的导入.有时候导入进度慢,电脑风扇狂转真的很让人崩溃,其实有些小技巧是可以让导入更快速 ...

  5. Can’t update table ‘xxx’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger

    MySQL: Solution for ERROR 1442 (HY000): Can't update table 'xxx' in stored function/trigger because ...

  6. Swift系列七 - 汇编分析值类型

    通过汇编分下值类型的本质. 一.值类型 值类型赋值给var,let或者给参数传参,是直接将所有内容拷贝一份.类似于对文件进行复制粘贴操作,产生了全新的文件副本,属于深拷贝(deep copy). 示例 ...

  7. [bug] vue cli 部署在 springboot中报404

    复制资源时,在static目录下新建了一个static目录,估计是引起了spring解析的混乱,改为one后即可正常访问 参考 https://www.cnblogs.com/qianjinyan/p ...

  8. [bug]Flask:KeyError: 'A secret key is required to use CSRF.'

    参考 https://blog.csdn.net/huanglianggu/article/details/81263865

  9. mysqldMY-010457] [Server] --initialize specified but the data directory has files in it. Aborting. 2020-12

    删除mysql的/var/lib/mysql目录下的所有文件 https://blog.csdn.net/tr1912/article/details/81271851 # mysqld --init ...

  10. SPEC CPU2006的安装和使用

    https://www.spec.org/download.html http://blog.lazzzy.xyz/2017/09/15/SPEC_CPU2006/ BenchMark SPEC CP ...