[SDOI2008]递归数列

题目描述

一个由自然数组成的数列按下式定义:

对于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的余数的值。

输入输出格式

输入格式:

输入文件spp.in由四行组成。

第一行是一个自然数k。

第二行包含k个自然数b1, b2,...,bk。

第三行包含k个自然数c1, c2,...,ck。

第四行包含三个自然数m, n, p。


输出格式:

输出文件spp.out仅包含一行:一个正整数,表示(am + am+1 + am+2 + ... + an) mod p的值。

输入输出样例

输入样例#1:

2
1 1
1 1
2 10 1000003
输出样例#1:

142

说明

对于100%的测试数据:

1<= k <=15

1 <= m <= n <= 1018

对于20%的测试数据:

1<= k <=15

1 <= m <= n <= 106

对于30%的测试数据:

k=1 1 <= m <= n <= 1018

对于所有测试数据:

0<= b1, b2,... bk, c1, c2,..., ck<=109

1 <= p <= 108

挺水的一道题,推出了矩阵,然后前缀和搞搞也就简单了;

矩阵如下:

S[n]
b[n]
b[n-1]
...
b[n-k+1]

=

1 c[1] ... c[k-1] c[k]
0 c[1] ... c[k-1] c[k]
0 1 ... 0 0
0 0 ... 0 0
0 0 ... 1 0

*

S[n-1]
b[n-1]
b[n-2]
...
b[n-k+1]
#include<bits/stdc++.h>
#define ll long long
#define maxn 20
using namespace std; ll k,b[maxn],c[maxn],n,m,p,tot; struct mat{
ll x,y;
ll s[maxn][maxn];
}; mat operator *(mat a,mat b)
{
mat c;
c.x = a.x;
c.y = b.y;
memset(c.s,,sizeof(c.s));
for(ll i=;i<=a.x;i++)
for(ll j=;j<=b.y;j++)
for(ll k=;k<=b.x;k++)
c.s[i][j] = (c.s[i][j] + a.s[i][k] * b.s[k][j] % p) % p;
return c;
} mat ksm(mat a,ll ci)
{
mat ans;
memset(ans.s,,sizeof(ans.s));
ans.x = ans.y = a.x;
for(ll i=;i<=ans.x;i++)
ans.s[i][i] = ;
while(ci)
{
if(ci & ) ans = ans * a;
a = a * a;
ci >>= ;
}
return ans;
} ll find(ll num)
{
if(num <= k)
{
ll ans = ;
for(ll i=;i<=num;i++) ans += b[i],ans %= p;
return ans % p;
}
mat ans;
memset(ans.s,,sizeof(ans.s));
ans.x = ans.y = k + ;
for(ll i=;i<=k+;i++)
ans.s[][i] = ans.s[][i] = c[i - ];
ans.s[][] = ;
for(ll i=;i<=k;i++)
ans.s[i + ][i] = ;
ans = ksm(ans , num - k);
mat right;
memset(right.s,,sizeof(right.s));
right.x = k + ;
right.y = ;
for(ll i=;i<=k+;i++)
right.s[i][] = b[k + - i];
right.s[][] = tot;
right = ans * right;
return right.s[][];
} int main(){
cin >> k;
for(ll i=;i<=k;i++) scanf("%d",&b[i]),tot += b[i];
for(ll i=;i<=k;i++) scanf("%d",&c[i]);
cin >> m >> n >> p;
cout << (find(n) - find(m - ) + p) % p;
}

开始玩矩阵了!先来一道入门题![SDOI2008]递归数列的更多相关文章

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

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

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

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

  3. 可恶!学了这么久的LCA,联考的题目却是LCA+树形DP!!!可恶|!!!这几天想学学树形DP吧!先来一道入门题HDU 1520 Anniversary party

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

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

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

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

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

  6. [luoguP2461] [SDOI2008]递归数列(DP + 矩阵优化)

    传送门 本题主要是构造矩阵,我们只需要把那一段式子看成两个前缀和相减, 然后就直接矩阵连乘. 直接对那个k+1阶矩阵快速幂即可,注意初始化矩阵为单位矩阵,即主对角线(左上到右下)都为1其他都为0. 另 ...

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

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

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

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

  9. P2461 [SDOI2008]递归数列 矩阵乘法+构造

    还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...

随机推荐

  1. 【BASIS系列】SAP 日志管理

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 日志管理   前言部分 ...

  2. cocos2dx基础篇(15) 列表视图CCTableView

    [3.x] (1)去掉 "CC" (2)TableViewCell 中: > unsigned int getIdx() 返回类型改为 ssize_t(类型为 long) ( ...

  3. 2d平台怪物逻辑

    2d来回巡逻 遇到坑会自动转向 可配置单次方向行走的时间,转向等待时间等 using System; using System.Collections; using System.Collection ...

  4. (二)inlineCallbacks,同步方式写异步代码

    一. 上篇提到了用defered对象注册回调的方式,来处理异步操作,这样大家都知道,实际情况代码很难搞的.因为当业务逻辑复杂后,这边一个异步操作,我们注册一个回调,代码跳到A地方,A里面也有异步操作, ...

  5. selectnodes和selectSingleNode

    selectnodes: selectNodes和ChildNodes获取XML内容数组的差异性 我们在使用XML进行查询或者变更数据的时候,需要注意两个很相近但结果相差很大的用法,如下: 1: Xm ...

  6. linux的进程间通信概述

    一 进程间通信 1.1. linux内核提供多种进程间通信机制 a. 无名管道和有名管道 b. SystemV IPC:信号量.消息队列.共享内存 c. Socket域套接字 d. 信号 1.2. 无 ...

  7. 最小生成树: HDU1233还是畅通工程

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. SCUT - 484 - 平面上的点 - 数据结构

    https://scut.online/p/484 一开始想的是按固定斜率的直线从无穷扫下来,但是一直都WA,不知道是哪里错了还是精度问题? #include<bits/stdc++.h> ...

  9. 区块链开源实现hyperledger fabric架构详解

    hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM.Intel.各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量.本文中我们依次讨论:区块链 ...

  10. 完整ASP.Net Excel导入

    //把EXCEL文件上传到服务器并返回文件路径        private String typename(FileUpload fileloads)        {            str ...