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

Description

一个由自然数组成的数列按下式定义:
对于i <= kai = bi
对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k
其中bjcj1<=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


用c矩阵做矩阵乘法。

由于需要求和我们在矩阵中加一项表示Sn。

然后直接上矩阵快速幂。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define N 20
ll p,c[N],a[N],b[N],s[N];
int n,m;
struct Mat {
ll v[N][N];
Mat() {memset(v,0,sizeof(v));}
Mat operator * (const Mat &x) const {
Mat re; int i,j,k;
for(i=1;i<=m;i++) {
for(j=1;j<=m;j++) {
for(k=1;k<=m;k++) {
re.v[i][j]=(re.v[i][j]+v[i][k]*x.v[k][j])%p;
}
}
}
return re;
}
}X;
Mat qp(Mat x,ll y) {
Mat I;
int i;
for(i=1;i<=m;i++) I.v[i][i]=1;
for(;y;y>>=1ll,x=x*x) if(y&1ll) I=I*x;
return I;
}
ll getS(ll y) {
if(y<=n) return s[y];
Mat T=qp(X,y-n);
ll re=0;
int i;
for(i=1;i<=n;i++) re=(re+a[i]*T.v[m][i])%p;
re=(re+s[n]*T.v[m][m])%p;
return re;
}
int main() {
scanf("%d",&n);
int i;
ll l,r;
for(i=1;i<=n;i++) scanf("%lld",&b[i]);
for(i=1;i<=n;i++) scanf("%lld",&c[i]);
scanf("%lld%lld%lld",&l,&r,&p);
for(i=1;i<=n;i++) a[n-i+1]=b[i];
for(i=1;i<=n;i++) s[i]=s[i-1]+a[i];
for(i=1;i<=n;i++) X.v[1][i]=X.v[n+1][i]=c[i];
for(i=2;i<=n;i++) X.v[i][i-1]=1;
m=n+1;
X.v[m][m]=1;
// printf("%lld %lld\n",l,r);
// printf("%lld\n",getS(l-1));
printf("%lld\n",(getS(r)-getS(l-1)+p)%p);
}

最新文章

  1. Tomcat中的Session小结
  2. [LeetCode] Find All Duplicates in an Array 找出数组中所有重复项
  3. webBrowser1
  4. 搭建LAMP环境注意事项
  5. volatile关键字并不能作为线程计数器
  6. html内容写入到文件中的时候出现‘TypeError: expected a character buffer object’错误
  7. C#网络资源列表
  8. SQL基础理论题
  9. uvalive4015 (树上背包)
  10. [kuangbin带你飞]专题四 最短路练习 POJ 2253 Frogger
  11. asp.net权限认证:HTTP基本认证(http basic)
  12. cmd中添加snmpd被控
  13. js经典闭包
  14. 基于Cisco packet tracer的AAA认证
  15. ELK 使用4-Kafka + zookpeer
  16. 机器学习课程-第7周-支持向量机(Support Vector Machines)
  17. oracle中并行执行不一定比串行执行快
  18. HPU第四次积分赛-K :方框(水题,打印图形)
  19. Android 数据存储02之文件读写
  20. (转载)220v交流接触器自锁接线图另接热继电器

热门文章

  1. Controller 层实现
  2. 【Nginx】事件驱动框架和异步处理
  3. Mondiran创建连接
  4. Java多线程之~~~ReadWriteLock 读写分离的多线程实现
  5. Solaris服务管理
  6. substr使用注意
  7. Regex 手机号 座机 正則表達式
  8. WPF03(样式)
  9. 调试LD_PRELOAD注入的代码
  10. Webkit JNI