Time Limit: 1 Sec Memory Limit: 256 MB
Submit: 916 Solved: 408
[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

解题思路

这道题可以看成一个类似斐波那契数列的矩阵乘法,初始矩阵是一行长度为k+1,前k个元素为b[i],最后一个为前缀和。而转移矩阵是一个(k+1)*(k+1)的矩阵,前k-1列中a[i+1][i]为1,第k列前k行为c[k]~c[1]这k个元素,最后一行为0。第k+1列前k行为c[k]~c[1]这k个元素,最后一行 为1,这样就可以转移。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>using namespace std;
const int MAXN = 20;
typedef long long LL;int k;
LL b[MAXN],c[MAXN],p,n,m;
LL sum[MAXN],ans1,ans2;struct Mat{LL a[MAXN][MAXN];Mat(){memset(a,0,sizeof(a));}Mat operator*(const Mat &h){Mat ret;for(register int i=1;i<=k+1;i++)for(register int j=1;j<=k+1;j++)for(register int o=1;o<=k+1;o++)ret.a[i][j]=(ret.a[i][j]+a[i][o]*h.a[o][j])%p;return ret;}
}pre,ans,data;inline Mat fast_pow(Mat A,LL b){Mat ret;for(register int i=1;i<=k+1;i++) ret.a[i][i]=1;for(;b;b>>=1){if(b&1) ret=ret*A;A=A*A;}return ret;
}int main(){scanf("%d",&k);for(register int i=1;i<=k;i++) scanf("%lld",&b[i]);for(register int i=1;i<=k;i++) scanf("%lld",&c[i]);scanf("%lld%lld%lld",&m,&n,&p);for(register int i=1;i<=k;i++) pre.a[1][i]=b[i],sum[i]=(sum[i-1]+b[i])%p;pre.a[1][k+1]=sum[k];for(register int i=1;i<=k-1;i++) data.a[i+1][i]=1;for(register int i=1;i<=k;i++) data.a[i][k]=data.a[i][k+1]=c[k-i+1];data.a[k+1][k+1]=1;
//  for(register int i=1;i<=k+1;i++) cout<<pre.a[1][i]<<" ";
//  cout<<endl;
//  cout<<"------------>"<<endl;
//  for(register int i=1;i<=k+1;i++){//      for(register int j=1;j<=k+1;j++)
//          cout<<data.a[i][j]<<" ";
//      cout<<endl;
//  }if(m<=k) ans1=sum[m-1];else ans1=((pre*fast_pow(data,m-k-1)).a[1][k+1]);if(n<=k) ans2=sum[n];else ans2=((pre*fast_pow(data,n-k)).a[1][k+1]);
//  cout<<ans1<<" "<<ans2<<endl;printf("%lld",((ans2-ans1)%p+p)%p);return 0;
}

转载于:https://www.cnblogs.com/sdfzsyq/p/9676914.html

BZOJ 3231: [Sdoi2008]递归数列相关推荐

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=3231 和斐波那契一个道理在最后加一个求和即可 1 #include<cstdio> 2 ...

  2. [BZOJ] 3231: [Sdoi2008]递归数列

    看起来就像一个加权的斐波那契数列变形!(这个权是倒序加的,没仔细读题正着构造了矩阵,卡着30分百思不得其解qwq,现在看来应该是k=1的30分) 构造一个矩阵,就可以很方便地求出第n项,但是它要求一段 ...

  3. BZOJ:3231: [Sdoi2008]递归数列

    题解: 矩阵乘法,在矩阵中构造当前前缀和: 注意:for(int/long long ;;); #include<iostream> #include<cstdio> #inc ...

  4. [BZOJ3231] [Sdoi2008]递归数列

    [BZOJ3231] [Sdoi2008]递归数列 题目大意 给定Ci,i∈[1,k]给定C_i,i\in[1,k] 定义 若i>k,Ai=Ai−1∗C1+Ai−2∗C2+⋯+Ai−k∗Ck若i ...

  5. bzoj3231 [SDOI2008]递归数列 矩乘

    标准的矩乘模型,标准的数据范围 注意构造矩阵的时候使用倍增转移法,这样清晰得多 注: 由于我的写法问题,前缀和算到n-1,所以要n++,而<k的部分与后面前缀和的运算无关,所以还要再减回来 码: ...

  6. review 9.29 viv 逃命 递归数列

    T1 逃命 survive Time Limit: 1 Sec  Memory Limit: 32768 K Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能 ...

  7. C语言-函数-递归数列

    题目:递归数列 类别 函数与递归 程序类型: 代码片段 时间限制: 2S 内存限制 10000Kb 问题描述 一个数列A定义如下 A(1)=1, A(2)=1/(1+A(1)), A(3)=1/(1+ ...

  8. 递归数列(recursive sequence)

    递归数列-递归数列 (recursive sequence ):一种用归纳方法给定的数列. 递归数列-举例 例如,等比数列可以用归纳方法来定义,先定义第一项 a1 的值( a1 ≠ 0 ),对 于以后 ...

  9. 剑指offer | 递归数列

    在这里整理一下递归数列的简单运用. 首先,写写用到的斐波那契数列 0 1 1 2 3 5 8 - 题目1:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. 这是一个很正常 ...

  10. 冷月虐哭数一之高等数学(1)-递归数列极限的求法和证明

    本文目录 前言 方法论 例题 总结 前言 高等数学是理工科考研都需要考的科目之一,不管是数一.数二.数三都是考纲中的内容.而极限又是高数中的基础,是微分学的基础.所以,我们一定要打好基础,才能在考试中 ...

最新文章

  1. python爬图片教程_python爬去妹子网整个图片资源教程(最详细版)
  2. HDU5692(线段树+dfs序)
  3. 【简明教程】windows下xgboost安装到python
  4. 释疑のSAP库位的创建
  5. [Qt教程] 第11篇 2D绘图(一)绘制简单图形
  6. 【算法系列之九】合并两个有序数组
  7. python 3 一些常用的内置数据结构介绍
  8. Java-Arrays数组操作
  9. 激活Maven profile的几种方式
  10. Spring Security Oauth2 认证(获取token/刷新token)流程
  11. cisco初级随堂笔记1
  12. [远程控制]木马伪装:图片
  13. VHDL n进制计数器
  14. 小武与retinanet的斗争
  15. Excel公式笔记(COUNTIFS)
  16. 怎么禁用计算机上的自动播放,关闭自动播放,小编教你Win7怎么关闭自动播放功能...
  17. 纯JAVA实现雷电飞机大战<可本地联机>
  18. P4745 B’s problem(b)
  19. 因为计算机丢失vrender,3DMAX打开文件时显示缺少dll解决方案
  20. js调用swift相册DEMO(网易新闻)

热门文章

  1. 拓端tecdat|R语言用于线性回归的稳健方差估计
  2. C Primer Plus 第七章 第九题
  3. 长沙理工计算机科学与技术考研,2021年长沙理工大学计算机科学与技术(081200)考研专业目录_硕士研究生考试范围 - 学途吧...
  4. 用文本方式将数据装入一个数据库表 mysql_文本应该放哪_MySQL用文本方式将数据装入数据库表中...
  5. pytorch冻结模型
  6. keras 多分类一些函数参数设置
  7. Shell命令学习笔记
  8. 用python简单处理图片(3):添加水印
  9. Python从头开始的演变策略
  10. insert into 语句 mysql_sql insert into 语句