暴力:

正解:

考虑循环矩阵,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. 狂神说Elasticsearch7.X学习笔记整理

    Elasticsearch概述 一.什么是Elasticsearch? Lucene简介 Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供 Lucene提供了一个简 ...

  2. 【近取 key】功能规格说明书

    目录 前置信息说明 概念介绍 记忆宫殿 A4纸背单词法 词图 单词掌握程度相关 用户和典型场景 系统功能设计 主页 词图相关功能 创建词图 查看词图 复习词图 个人控制台相关功能 我的词图 统计信息 ...

  3. 【转】java-selenium三种等待方式

    方式1: 线程等待:Thread.sleep(xxxx) 只要在case中加入sleep就会强制等待设置的时间后才会执行之后的命令,这种等待一般适用于调试脚本的时候. java代码: //等待3秒 T ...

  4. 高阶函数 / abs方法

    abs()求绝对值,填括号里面

  5. Linux常见错误解决办法

    1. 程序运行的一些基础知识 1. 编译程序时去哪找头文件? 系统目录:就是交叉编译工具链里的某个 include 目录:也可以自己指定:编译时用 " -I dir "选项指定. ...

  6. Advanced Archive Password Recovery (ARCHPR) 是一个强大的压缩包密码破解工具,适用于ZIP和RAR档案的高度优化的口令恢复工具。

    RAR压缩文件密码破解工具是一款简单易用的RAR文档和ZIP文档密码破解软件,如果你不小心忘了解压密码或是下载的RAR文件需要密码,那么均可以使用本软件进行暴力破解.不管WinRAR /RAR 的密码 ...

  7. 大文件查找 du -ahx . | sort -rh | head -10

    # cd /root@test-W330-C30:/# du -ahx . | sort -rh | head -58.2G .5.6G ./usr3.3G ./usr/share1.9G ./usr ...

  8. mysql基础之mariadb库管理和表管理语句

    一.数据库管理语句 1.Syntax: CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ... cr ...

  9. getaddrinfo()函数详解-(转自 cxz2009)

    1. 概述IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间.IPv ...

  10. linux(centos 7)下安装JDK,Tomcat,mysql 运行Maven 项目

    一.在Linux中安装JDK 1. 将JDK上传到root下(任何位置均可以). 如图: 2. 用解压命令解压JDK tar -xvf (此处为jdk文件名) 如果是rpm包,执行rpm -i jdk ...