[luoguP2461] [SDOI2008]递归数列(DP + 矩阵优化)
本题主要是构造矩阵,我们只需要把那一段式子看成两个前缀和相减, 然后就直接矩阵连乘。
直接对那个k+1阶矩阵快速幂即可,注意初始化矩阵为单位矩阵,即主对角线(左上到右下)都为1其他都为0。
另外,很多量要开long long。
- #include <cstdio>
- #include <cstring>
- #define LL long long
- int k;
- LL b[21], c[21], n, m, p;
- struct Matrix
- {
- int n, m;
- LL a[21][21];
- Matrix()
- {
- n = m = 0;
- memset(a, 0, sizeof(a));
- }
- }sum, sum1, sum2, t;
- inline Matrix operator * (Matrix x, Matrix y)
- {
- int i, j, k;
- Matrix ans;
- ans.n = x.n;
- ans.m = y.m;
- for(i = 1; i <= x.n; i++)
- for(j = 1; j <= y.m; j++)
- for(k = 1; k <= y.n; k++)
- ans.a[i][j] = (ans.a[i][j] + x.a[i][k] * y.a[k][j]) % p;
- return ans;
- }
- inline Matrix operator ^ (Matrix x, LL y)
- {
- int i;
- Matrix ans;
- ans.n = ans.m = k + 1;
- for(i = 1; i <= k + 1; i++) ans.a[i][i] = 1;
- for(; y; y >>= 1)
- {
- if(y & 1) ans = ans * x;
- x = x * x;
- }
- return ans;
- }
- int main()
- {
- int i;
- scanf("%d", &k);
- for(i = 1; i <= k; i++) scanf("%lld", &b[i]);
- for(i = 1; i <= k; i++) scanf("%lld", &c[i]);
- scanf("%lld %lld %lld", &m, &n, &p);
- for(i = 1; i <= k; i++) b[i] %= p, c[i] %= p;
- sum.n = sum.m = k + 1;
- sum.a[1][1] = 1;
- for(i = 3; i <= k + 1; i++) sum.a[i][i - 1] = 1;
- for(i = 2; i <= k + 1; i++) sum.a[1][i] = sum.a[2][i] = c[i - 1];
- t.n = k + 1;
- t.m = 1;
- for(i = 2; i <= k + 1; i++)
- {
- t.a[i][1] = b[k - i + 2];
- t.a[1][1] = (t.a[1][1] + b[i - 1]) % p;
- }
- if(n - k > 0)
- sum1 = (sum ^ (n - k)) * t;
- else for(i = 1; i <= n; i++)
- sum1.a[1][1] = (sum1.a[1][1] + b[i]) % p;
- if(m - k - 1 > 0)
- sum2 = (sum ^ (m - k - 1)) * t;
- else for(i = 1; i < m; i++)
- sum2.a[1][1] = (sum2.a[1][1] + b[i]) % p;
- printf("%lld\n", ((sum1.a[1][1] - sum2.a[1][1]) % p + p) % p);
- return 0;
- }
[luoguP2461] [SDOI2008]递归数列(DP + 矩阵优化)的更多相关文章
- BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法
BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1a ...
- bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
今天真是莫名石乐志 一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样 然后记!得!开!long!long!! #include<iostream> #in ...
- BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )
矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...
- 开始玩矩阵了!先来一道入门题![SDOI2008]递归数列
[SDOI2008]递归数列 题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + c ...
- BZOJ3231: [Sdoi2008]递归数列
BZOJ3231: [Sdoi2008]递归数列 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + ...
- hdu 4576(简单概率dp | 矩阵优化)
艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle? 感觉很不公平.大家算法都一致,因为我程序没有那 ...
- CF1151F Sonya and Informatics (计数dp+矩阵优化)
题目地址 Solution (duyi是我们的红太阳) (这里说一句:这题看上去是一个概率dp,鉴于这题的概率dp写法看上去不好写,我们其实可以写一个计数dp) 首先拿到这个题目我们要能设出一个普通d ...
- Codeforces 917C - Pollywog(状压 dp+矩阵优化)
UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...
- New Year and Old Subsequence CodeForces - 750E (dp矩阵优化)
大意: 给定字符串, 每次询问区间[l,r]有子序列2017, 无子序列2016所需要删除的最小字符数 转移用矩阵优化一下, 要注意$(\mathbb{Z},min,+)$的幺元主对角线全0, 其余全 ...
随机推荐
- solr facet查询及solrj 读取facet数据[转]
solr facet查询及solrj 读取facet数据 | 所属分类:solr facet solrj 一. Facet 简介 Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更 ...
- nodejs on raspi
一. https://cnodejs.org/topic/54032efa9769c2e93797cd06 其中的 “安装Node.js” 一节 注意事项: 1. 它用的是v0.10.26(很早的版本 ...
- Math.net,.net上的科学计算利器
F#在科学计算领域的应用,包括部分语法介绍. Math.net,.net上的科学计算利器 摘要: .net上科学计算个人觉得首选numpy和scipy for dotnet.因为这两个库用户数量已经非 ...
- Selenium私房菜系列2 -- XPath的使用【ZZ】
在编写Selenium案例时,少不免是要用到XPath的,现在外面关于XPath使用的参考资料很多,下面我直接转一篇关于XPath使用的文档.如果对XPath不熟悉请参考下文,你不需要去百度/Goog ...
- iview modal 弹框 模板
iview modal 弹框 模板 <!-- * @description 上传图片 * @fileName camera.vue * @author 彭成刚 * @date // :: * @ ...
- AspNetCore容器化(Docker)部署(一) —— 入门
一.docker注册安装 Windows Docker Desktop https://www.docker.com/products/docker-desktop Linux Docker CE h ...
- freemarker list集合去重,实现hashset
在freemarker中没有提供去重的方法,虽然有提供定义hash的方法,如:<#assign myHash = { "name": "mouse", & ...
- win手动编译JAVA 未完成(系统path未加入文章)
java 下面存.BAT dir /s /B *.java > sources.txtjavac @sources.txt -bootclasspath "C:\Users\88797 ...
- SQL比较两表字段和字段类型
一.问题 业务需要把TB_Delete_KYSubProject表数据恢复到TB_KYSubProject,但提示错误,错误原因是两表字段类型存在不一致 insert into [TB_KYSubPr ...
- WebGL 绘制Line的bug(三)
之前铺垫了许多,今天可以来分享点纯干货了. 上一篇已经讲述了通过面模拟线条时候,每一个顶点的顶点数据包括:端点坐标.偏移量.前一个端点坐标.后一个端点坐标,当然如果我们通过索引的方式来绘制的话,还包括 ...