题不是很难,但是啊,人很傻啊。。。机子也很鬼畜啊。。。

3231: [Sdoi2008]递归数列
Time Limit: 1 Sec Memory Limit: 256 MB
Submit: 569 Solved: 241
[Submit][Status][Discuss]

Description
一个由自然数组成的数列按下式定义:
对于i <= k:ai = bi
对于i > k: ai = c1ai-1 + c2ai-2 + … + ckai-k
其中bj和 cj (1<=j<=k)是给定的自然数。写一个程序,给定自然数m <= n, 计算am + am+1 + am+2 + … + an, 并输出它除以给定自然数p的余数的值。

Input
由四行组成。
第一行是一个自然数k。
第二行包含k个自然数b1, b2,…,bk。
第三行包含k个自然数c1, c2,…,ck。
第四行包含三个自然数m, n, p。

Output
仅包含一行:一个正整数,表示(am + am+1 + am+2 + … + an) mod p的值。

Sample Input
2
1 1
1 1
2 10 1000003

Sample Output
142

HINT
对于100%的测试数据:
1<= k<=15
1 <= m <= n <= 1018

Source

第一次调试:矩阵都是【1001】【1001】虽然很多余,但是理论上并没错,但是机子low每次调用到就炸....
第二次调试:矩阵的初始化调上次时不小心删了....又WA....
第三次调试:出现负数,以为爆longlong果断+快速乘,still booming
然后发现是最后做前缀和减法时..可能减到负了.....
于是A之,带快速乘版本1600MS+,删之160MS+....珍爱生命远离快速乘TAT

构造的矩阵如下:

S为前缀和…最后只需要进行前缀和相减即可…

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long read()
{long long x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}long long k,m,n,p;
long long s=0;
long long cc[50],bb[50];
struct Mat{long long da[50][50];Mat(){memset(da,0,sizeof(da));}
};//long long quick_mul(long long x,long long y)
//{//    if (y==0) return 0;
//    if (y==1) return x%p;
//    long long re;
//    re=quick_mul(x,y>>1);
//    if ((y&1)==1) return (re+re+x)%p;
//             else return (re+re)%p;
//}Mat mul(Mat A,Mat B)
{Mat C;for (int i=1; i<=k+1; i++)for (int j=1; j<=k+1; j++)for (int kk=1; kk<=k+1; kk++)C.da[i][j]=(C.da[i][j]+(A.da[i][kk]*B.da[kk][j])%p)%p;return C;
} Mat quick_pow(Mat A,long long x)
{Mat re;for (int i=1; i<=k+1; i++) re.da[i][i]=1;for (long long i=x; i; i>>=1,A=mul(A,A))if (i&1) re=mul(re,A);return re;
}Mat a;
Mat b;
void init()
{for (int i=1;i<=k;i++)  a.da[i][1]=a.da[i][k+1]=cc[i];for (int i=2;i<=k;i++)  a.da[i-1][i]=1;a.da[k+1][k+1]=1;for (int i=1;i<=k;i++)  b.da[1][i]=bb[k-i+1];b.da[1][k+1]=s;
}long long work(long long x)
{if (x==0) return b.da[1][k+1];Mat re;re=quick_pow(a,x);re=mul(b,re);return re.da[1][k+1];
}int main()
{k=read();for (int i=1; i<=k; i++) bb[i]=read();for (int i=1; i<=k; i++) cc[i]=read();   m=read(),n=read(),p=read();for (int i=1; i<=k; i++) bb[i]%=p,s=(s+bb[i])%p,cc[i]%=p;long long ans=0;if (n<=k) {for (int i=m; i<=n; i++) ans=(ans+bb[i])%p;printf("%lld\n",ans);return 0;}init();ans=work(n-k);if (m>k) ans=(ans-work(m-k-1))%p;else for (int i=1; i<m; i++) ans=(ans-bb[i])%p;ans=(ans+p)%p;printf("%lld\n",ans);return 0;
}

BZOJ-3231 递归数列 矩阵连乘+快速幂相关推荐

  1. 算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数

    题目分析 来源:acwing 分析: 先利用矩阵运算的性质将通项公式变成幂次形式,然后用快速幂的方法求解第 n项. 斐波那契数列的递推公式:f1=f2=1,fn=fn−2+fn−1(n≥3)f_1 = ...

  2. 矩阵乘法和快速幂的一些优化和剪枝

    矩阵相乘 一般会用O(n^3)的方法...配合剪枝[添条件,设门槛...] //O(n^3)算法 #include <iostream> #include <cstdio> # ...

  3. Setsuna的K数列 进制转换 快速幂

    题目描述 Komorebi非常喜欢数列,但他实在太弱了无法想象出一个数列该如何构造,于是他就去FD(Frog Department)找Setsuna求助,Setsuna是一名光荣的FTCer(Frog ...

  4. HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系快速幂取模)

    题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以 ...

  5. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

  6. 快速幂+矩阵优化斐波那契数列(超详细教程)

    文章目录 前言 一.快速幂 二.矩阵优化斐波那契数列 1.矩阵相关知识 2.斐波那契数列用矩阵表示 3.O(log2n)的斐波那契数列 三.全部实现代码 前言 我们首先讲解快速幂,然后利用快速幂优化矩 ...

  7. 矩阵快速幂的一份小结

    矩阵真是个好东西!虽然矩乘的复杂度有点难看... ... 这几天也做了不少矩阵题目,还是有几道好题目的.不过我打算从入门开始. 矩阵乘法:A[i][k]*B[k][j]=C[i][j];(A的第i行的 ...

  8. 快速幂、快速乘、矩阵快速幂

    文章目录 一 快速幂 模板 模板例题 二 快速乘 模板 三 矩阵快速幂 例题 模板题 应用题1 应用题2 一 快速幂 目的:当我们在求f(x) = a ^ x % mod时,f(x)的结果会呈指数型增 ...

  9. python【数据结构与算法】快速幂and矩阵快速幂取模(看不懂你来打我)

    文章目录 1 解释快速幂 2 代码(这里就不考虑指数为小于0的情况了) 3 下面是矩阵快速幂,区别只是底数换成了矩阵 1 解释快速幂 传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:2^1 ...

  10. POJ3070矩阵快速幂简单题

    题意:       求斐波那契后四位,n <= 1,000,000,000. 思路:        简单矩阵快速幂,好久没刷矩阵题了,先找个最简单的练练手,总结下矩阵推理过程,其实比较简单,关键 ...

最新文章

  1. pthread_mutex_lock的thread特性
  2. 使用Postman完成接口测试
  3. SpringCloud-服务注册与实现-Eureka创建服务提供者(附源码下载)
  4. Java平台无关性——跨平台
  5. 【深度学习】后ResNet时代的顶流EfficientNet
  6. 金山云和金山办公均成功上市 雷军揭秘背后原因
  7. 计算机应用培训课程安排表,计算机培训教学计划
  8. Flask 发布 1.0 稳定版
  9. css实现白光划过效果
  10. java 刻度尺,刻度尺选择控件
  11. vbox vdi磁盘注册_VirtualBox的虚拟磁盘vdi文件扩容方法
  12. SQL基础操作(3):对表中元进行简单删,改,查的操作【增在2中】
  13. Retrofit 2简单使用教程
  14. osg for android 学习之五:场景漫游
  15. java 羽化_程序员羽化之路--假如需要一百万个对象
  16. CODESYS自动化仿真软件如何与EtherNet IP工业RID读写器|读卡器CK-RF102AN-E01联机工作
  17. Mycat高可用解决方案一(mysql安装)
  18. Easy Code的使用教程(带模板)
  19. 天图视频批量下载工具
  20. 第一波:HTML+CSS+JavaScript数据可视化大屏平台模板实例10大通用模板,面向各行各业

热门文章

  1. 软件接收机射频信号源matlab程序,射频信号源
  2. Safari浏览器插件 Tampermonkey
  3. 打开qq相册回收站一直显示服务器忙,qq照片回收站怎么打不开 手机qq回收站进不去怎么办...
  4. [NOI2015]小园丁与老司机,洛谷P2304,恶心的建图+有源汇上下界最小流
  5. Pytorch将数据集划分为训练集、验证集和测试集
  6. 2015上半年教师资格考试高中数学(404)- 用向量数量积推导两角差余弦公式
  7. 为什么我们会有假期一结束,快乐就终止的感觉?
  8. Cypress Test
  9. 【C语言基础学习笔记】+ 【C语言进阶学习笔记】总结篇(坚持才有收获!)
  10. 一元二次方程的简单解法