暴力:

正解:

考虑循环矩阵,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. Zoho Projects助力企业项目高效管理

    挑选项目管理工具,就和人买衣服.买鞋子是一样的,除了看外观,最重要的是合适.随着项目管理工具的不断发展,市面上有很多工具都非常优秀,也能解决企业.团队的实际需求. 对于项目管理来说,最重要的在于人员协 ...

  2. [MySQL数据库之事务、读现象、数据库锁机制、多版本控制MVCC、事务隔离机制]

    [MySQL数据库之事务.读现象.数据库锁机制.多版本控制MVCC.事务隔离机制] 事务 1.什么是事务: 事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻 ...

  3. 《前端运维》一、Linux基础--02用户与权限

    其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的. 上一篇文章我们学习了基本的指令和vim编辑器的操作方法.这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识. 一.用户与用户组 ...

  4. MSSQL·备份数据库中的单表

    阅文时长 | 0.11分钟 字数统计 | 237.6字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·备份数据库中的单表』 编写人 | SCscHero 编写时间 | 20 ...

  5. 通过Cloudflare开启全站https

    Cloudflare 添加域名后,会自动生成通用证书,快速开启全站HTTPS,服务端不用做任何修改,还可以选择多种开启模式 一.注册Cloudflare账号 直接打开网站:https://www.cl ...

  6. Jekyll+GitHub Pages部署自己的静态Blog

    混了这么久,一直想拥有自己的博客,通过jekyll和GitHub Pages捣腾出了自己的博客(https://www.ichochy.com) 一.安装jekyll 首先有安装Ruby的开发环境 运 ...

  7. ES6中的展开运算符和解构对象

    let obj = { a:1 b:2 } let obj2 = { ...obj c:3 d:4 } console.log(obj2)//1,2,3,4,对象展开 //常考题目 let a = 1 ...

  8. Win10开启移动热点

    Win10开启移动热点 禁用 无线网卡 启动 无线网卡

  9. 032.Python魔术方法__new__和单态模式

    一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...

  10. 程序"三高"解决方案

    0. 程序三高 1. 缓存 2. 预处理和延后处理 3. 池化 3.1 内存池 3.2 线程池 3.3 连接池 4. 异步(回调) 5. 消息队列 5.1 服务解耦 5.2 异步处理 5.3 流量削峰 ...