传送门

本题主要是构造矩阵,我们只需要把那一段式子看成两个前缀和相减, 然后就直接矩阵连乘。

直接对那个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 + 矩阵优化)的更多相关文章

  1. BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法

    BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1a ...

  2. bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】

    今天真是莫名石乐志 一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样 然后记!得!开!long!long!! #include<iostream> #in ...

  3. BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )

    矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...

  4. 开始玩矩阵了!先来一道入门题![SDOI2008]递归数列

    [SDOI2008]递归数列 题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + c ...

  5. BZOJ3231: [Sdoi2008]递归数列

    BZOJ3231: [Sdoi2008]递归数列 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + ...

  6. hdu 4576(简单概率dp | 矩阵优化)

    艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle?  感觉很不公平.大家算法都一致,因为我程序没有那 ...

  7. CF1151F Sonya and Informatics (计数dp+矩阵优化)

    题目地址 Solution (duyi是我们的红太阳) (这里说一句:这题看上去是一个概率dp,鉴于这题的概率dp写法看上去不好写,我们其实可以写一个计数dp) 首先拿到这个题目我们要能设出一个普通d ...

  8. Codeforces 917C - Pollywog(状压 dp+矩阵优化)

    UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...

  9. New Year and Old Subsequence CodeForces - 750E (dp矩阵优化)

    大意: 给定字符串, 每次询问区间[l,r]有子序列2017, 无子序列2016所需要删除的最小字符数 转移用矩阵优化一下, 要注意$(\mathbb{Z},min,+)$的幺元主对角线全0, 其余全 ...

随机推荐

  1. solr管理界面下统计多个时间段的数据 facet.query

    在Raw Query Parameters参数里面输入时间段即可 如下图所示: facet.query=publishTime:[2017-06-05T00:00:00Z TO 2017-06-07T ...

  2. APPCLOUD禁止滚动条

  3. [转]VC++的类头文件

    本文转自:http://blog.csdn.net/forevertali/article/details/4370602   animal.h //在头文件中包含类的定义及类成员函数的声明 clas ...

  4. IDEA代码注释<斜体>的解决方法

    打开设置 将上图的checkbox取消勾选即可.

  5. VS Code使用技巧整理

    转自:https://blog.csdn.net/u011127019/article/details/58586129 https://blog.csdn.net/sgdd123/article/d ...

  6. 在git远程仓创建项目之后,提交本地项目的使用方法

    命令介绍 git 用户配置 git config --global user.name "张三" git config --global user.email "zhag ...

  7. Tomcat7的安装与配置

    Tomcat的安装及配置我曾经使用过tomcat,并实现了一个简单的servlet程序.没想到再次安装tomcat的时候用浪费了我大半天的时间.我想有必要做个总结,否则下次不知又要花费我多少时间. 1 ...

  8. js实现ctrl+v粘贴并上传图片

    前端页面: <textarea class="scroll" id="text" placeholder="在此输入...">& ...

  9. Python 中print 和return 的区别

    1.print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上. 2.return return语句[表达式]退出函数,选择性地向调用方返回一个表达式.不带参数值的retu ...

  10. uva1627 Team them up!

    注意这题要求互相认识不认识的人之间连一条线一个人在组1,那么不认识(互相认识)的人就在组0:同时这些人不认识的人就在组1.每个联通分量都可以独立推导,遇到矛盾则无解一个联通分量有一个核心,其他的点是分 ...