标准的矩乘模型,标准的数据范围

注意构造矩阵的时候使用倍增转移法,这样清晰得多

注:

由于我的写法问题,前缀和算到n-1,所以要n++,而<k的部分与后面前缀和的运算无关,所以还要再减回来

码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,P,b[19],c[19],daan1,daan2,g[19],ans[19],dp[19][19],dpl[19][19],i,j,k,l;
int main()
{scanf("%lld",&k);for(i=1;i<=k;i++)scanf("%lld",&b[i]);for(i=1;i<=k;i++)scanf("%lld",&c[i]);
scanf("%lld%lld%lld",&m,&n,&P);
n++;
dp[1][k]=c[k];
for(i=2;i<=k;i++)
{
dp[i][i-1]=1;
dp[i][k]=c[k-i+1];
}
for(i=1;i<=k;i++)
ans[i]=b[i],ans[k+1]+=b[i],ans[k+1]%=P;
ans[k+1]-=b[k];
ans[k+1]=(ans[k+1]+P)%P;
dp[k][k+1]=1;
dp[k+1][k+1]=1;  if(n<k){for(i=1;i<n;i++){daan1+=b[i];daan1%=P;}     }else{  n-=k;
while(n)
{
if(n&1)
{for(i=1;i<=k+1;i++)for(j=1;j<=k+1;j++){g[j]+=ans[i]*dp[i][j];g[j]%=P;       }for(i=1;i<=k+1;i++)ans[i]=g[i],g[i]=0;
}for(i=1;i<=k+1;i++)for(j=1;j<=k+1;j++)for(l=1;l<=k+1;l++){dpl[i][l]+=dp[i][j]*dp[j][l];dpl[i][l]%=P;        }for(i=1;i<=k+1;i++)for(j=1;j<=k+1;j++)dp[i][j]=dpl[i][j],dpl[i][j]=0;n/=2;
}
daan1+=ans[k+1];
daan1%=P;}
memset(dp,0,sizeof(dp));
memset(dpl,0,sizeof(dpl));
memset(ans,0,sizeof(ans));
memset(g,0,sizeof(g));
dp[1][k]=c[k];
for(i=2;i<=k;i++)
{
dp[i][i-1]=1;
dp[i][k]=c[k-i+1];
}
for(i=1;i<=k;i++)
ans[i]=b[i],ans[k+1]+=b[i],ans[k+1]%=P;
ans[k+1]-=b[k];
ans[k+1]=(ans[k+1]+P)%P;
dp[k][k+1]=1;
dp[k+1][k+1]=1;  if(m<k){for(i=1;i<m;i++){daan2+=b[i];daan2%=P;}     }else{  m-=k;
while(m)
{
if(m&1)
{for(i=1;i<=k+1;i++)for(j=1;j<=k+1;j++){g[j]+=ans[i]*dp[i][j];g[j]%=P;       }for(i=1;i<=k+1;i++)ans[i]=g[i],g[i]=0;
}for(i=1;i<=k+1;i++)for(j=1;j<=k+1;j++)for(l=1;l<=k+1;l++){dpl[i][l]+=dp[i][j]*dp[j][l];dpl[i][l]%=P;        }for(i=1;i<=k+1;i++)for(j=1;j<=k+1;j++)dp[i][j]=dpl[i][j],dpl[i][j]=0;m/=2;
}
daan2+=ans[k+1];
daan2%=P;}
printf("%lld",(daan1-daan2+P)%P);
}

bzoj3231 [SDOI2008]递归数列 矩乘相关推荐

  1. [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 ...

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

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

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

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

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

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

  5. review 9.29 viv 逃命 递归数列

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

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

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

  7. 递归数列(recursive sequence)

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

  8. 剑指offer | 递归数列

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

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

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

最新文章

  1. Matlab姿态表示
  2. 前端如何接收 websocket 发送过来的实时数据
  3. JavaScript:动态选中CheckBox
  4. 编译Linux 2.6内核
  5. golang高并发的理解
  6. Spring Mvc + Spring + Mybatis3 搭建Web工程详解
  7. Oracle外键级联删除和级联更新
  8. CF gym101933 K King's Colors——二项式反演
  9. 苹果发布 AirTag 固件更新
  10. mysql数据库教程子查询_MySQL数据库实操教程(17)——子查询
  11. SODB RBSP EBSP的区别
  12. 营业执照争夺背后:吴忌寒正在重塑比特大陆 |链捕手
  13. java使用RabbitMQ,学习了解
  14. 如何批量去除图片水印?批量去水印方法
  15. .click()与on('click',function())
  16. 手机计算机星点符号是除吗,手机星号怎么打
  17. http://www.csee.wvu.edu/~xinl/source.html 突然发现无法登陆,现备份内容以便后续查询
  18. 服务器基础知识全解(汇总版)
  19. SAP内部订单BAPI扩展字段
  20. android ios动态模糊效果,iOS实现模糊效果的几种方法

热门文章

  1. python从26个字母中随机挑选5个_【习题之Python篇】习题6
  2. Android笔记 ANR Application Not Response
  3. R语言学习笔记(五)假设检验及其R实现
  4. CenterNet+ deepsort实现多目标跟踪
  5. lan交换和无线教师手册_无线AP组网方式有多种,办公楼的无线覆盖系统的组网方式有哪些?...
  6. CAD2010 为了保护_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计
  7. 光电显示未连接服务器,T106串口服务器解决方案
  8. html打开网页过场动画_轻松教你学会网页设计
  9. JavaMail---简介
  10. 遍历结果集java_java – 循环遍历while循环后如何将结果集重置为第一行