还好$QwQ$


思路:矩阵快速幂

提交:1次

题解:

如图:

注意$n,m$如果小于$k$就不要快速幂了,直接算就行、。。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ull unsigned long long
#define ll long long
#define R register ll
using namespace std;
#define pause (for(R i=1;i<=10000000000;++i))
#define In freopen("NOIPAK++.in","r",stdin)
#define Out freopen("out.out","w",stdout)
namespace Fread {
static char B[<<],*S=B,*D=B;
#ifndef JACK
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
#endif
inline ll g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
if(ch==EOF) return EOF; do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} inline bool isempty(const char& ch) {return (ch<=||ch>=);}
inline void gs(char* s) {
register char ch; while(isempty(ch=getchar()));
do *s++=ch; while(!isempty(ch=getchar()));
}
} using Fread::g; using Fread::gs;
namespace Luitaryi {
const int N=;
int k,mod,b[N],c[N];
ll n,m,sumn,summ,sum[N];
ll ans[N],s[N],a[N][N],mem[N][N];
inline void mul(ll a[][N],ll b[][N]) {
R tmp[N][N]; memset(tmp,,sizeof(tmp));
for(R i=;i<=k+;++i) for(R l=;l<=k+;++l) for(R j=;j<=k+;++j)
tmp[i][j]=(tmp[i][j]+a[i][l]*b[l][j])%mod;
memcpy(a,tmp,sizeof(tmp));
}
inline void qpow(ll p) {
R ret[N][N]; memset(ret,,sizeof(ret));
for(R i=;i<=k+;++i) ret[i][i]=;
for(;p;p>>=,mul(a,a)) if(p&) mul(ret,a);
memcpy(a,ret,sizeof(a));
}
inline void main() {
k=g(); for(R i=;i<=k;i++) b[i]=g();
for(R i=;i<=k;++i) c[i]=g();
m=g()-k-,n=g()-k,mod=g();
const int M=mod;
for(R i=;i<=k;++i) sum[i]=(b[i]+sum[i-])%M;
for(R i=;i<=k;++i) s[i]=b[i]%M; s[k+]=sum[k]%M;
for(R i=;i<k;++i) a[i+][i]=;
for(R i=;i<=k;++i) a[i][k]=a[i][k+]=c[k-i+]%M; a[k+][k+]=;
if(n<=) return (void)printf("%lld\n",((sum[k+n-]-sum[k+m-])%M+M)%M);
memcpy(mem,a,sizeof(a));
qpow(n); for(R i=;i<=k+;++i) for(R j=;j<=k+;++j) ans[j]=(ans[j]+s[i]*a[i][j])%M; sumn=ans[k+];
if(m<=) return (void)printf("%lld\n",((sumn-sum[k+m])%M+M)%M);
memset(ans,,sizeof(ans)); memcpy(a,mem,sizeof(a));
qpow(m); for(R i=;i<=k+;++i) for(R j=;j<=k+;++j) ans[j]=(ans[j]+s[i]*a[i][j])%M; summ=ans[k+];
printf("%lld\n",((sumn-summ)%M+M)%M);
}
}
signed main() {
Luitaryi::main();
return ;
}

2019.07.21

P2461 [SDOI2008]递归数列 矩阵乘法+构造的更多相关文章

  1. bzoj 3231 [Sdoi2008]递归数列——矩阵乘法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 矩阵乘法裸题. 1018是10^18.别忘了开long long. #include& ...

  2. [bzoj3231][SDOI2008]递归数列——矩阵乘法

    题目大意: 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...

  3. [luogu2461 SDOI2008] 递归数列 (矩阵乘法)

    传送门 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai- ...

  4. 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂

    题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj  ...

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

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

  6. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

  7. bzoj 3231 [ Sdoi 2008 ] 递归数列 —— 矩阵乘法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 裸矩阵乘法. 代码如下: #include<iostream> #incl ...

  8. P2461 [SDOI2008]递归数列

    题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj 和 cj ...

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

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

随机推荐

  1. pipreqs 生成项目依赖的第三方包

    项目开发的时候,总是要搭建和部署环境. 如果项目使用virtualenv环境,直接使用使用命令行pip freeze可以帮助我们自动生成项目所需要的环境 requirements.txt文件 $ pi ...

  2. 1190: 零起点学算法97——A == B ?(Java)

    WUSTOJ 1190: 零起点学算法97--A == B ? Description Give you two integer numbers A and B, if A is equal to B ...

  3. Lucene全文检索_分词_复杂搜索_中文分词器

    1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search)  1.1.1 定义 全文检索就是先分词创建索引,再执行搜索的过 ...

  4. oracle 数据库 主键索引重建

    oracle 数据库 主键索引重建 alter table table_name drop primary key; alter table table_name add constraint pk_ ...

  5. Kafka 消息中间件

    kafka简介与应用场景 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Link ...

  6. IntelliJ IDEA调出problem窗口

    一.File =>Settings 二.搜索Compiler=>勾选Make project automatically 三.出现问题Problems窗口会报错 原文地址:https:// ...

  7. Xamarin(Android)制作启动画面

    1.将启动图片保存到Drawable文件夹下 2.在Drawable文件夹下创建splashscreen.xml <?xml version="1.0" encoding=& ...

  8. Docker 安装mysql5.6

    1.首先进入命令行现在mysql5.6镜像 E:\>docker pull mysql:5.6 2.把mysql的配置文件放入到本地,供后期做修改用 文件分别为:mysql.cnf 和 mysq ...

  9. win10下PLSQL Developer 连接ubuntu上安装的oracle 11g

    说明:过程记录的不是很相信,只记录基本步骤.并不适合想一步一步照做的同学. win10下需要的操作 1.微软官网下载instantclient,然后接到到本地一个文件夹,注意路径不要又空格,中文和括号 ...

  10. jQuery事件绑定和委托实例

    本文实例讲述了jQuery事件绑定和委托.分享给大家供大家参考.具体方法如下: jQuery事件的绑定和委托可以用多种方法实现,on()  . bind()  . live()  . delegate ...