BZOJ:3231: [Sdoi2008]递归数列
题解:
矩阵乘法,在矩阵中构造当前前缀和;
注意:for(int/long long ;;);
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint; Lint n,m;
int k,p;
int b[200];
int c[200];
Lint tmp1,tmp2;
Lint sum;
int minit(){
tmp1=tmp2=sum=0;
} struct Matrix{
Lint e[200][200];
Matrix(){
memset(e,0,sizeof(e));
}
int clear(){
memset(e,0,sizeof(e));
}
}t,x,y,z,ret; int Mul(){
z.clear();
for(int i=0;i<=k;++i){
for(int j=0;j<=k;++j){
for(int r=0;r<=k;++r){
z.e[i][j]=(z.e[i][j]+x.e[i][r]*y.e[r][j])%p;
}
}
}
} int Ksm(Lint p){
ret.clear();
for(int i=0;i<=k;++i)ret.e[i][i]=1;
while(p){
if(p<0)return 0;
if(p&1){
x=ret;y=t;Mul();
ret=z;
}
p>>=1;
x=t;y=t;Mul();
t=z;
}
} int main(){
minit(); scanf("%d",&k);
for(int i=1;i<=k;++i)scanf("%d",&b[i]);
for(int i=1;i<=k;++i)scanf("%d",&c[i]);
scanf("%lld%lld%d",&n,&m,&p);
for(int i=1;i<=k;++i)sum=(sum+b[i])%p; if(m<=k){
for(int i=n;i<=m;++i)tmp1=(tmp1+b[i])%p;
printf("%lld\n",tmp1);
return 0;
}else{ for(Lint i=n;i<=k;++i)tmp2=(tmp2+b[i])%p;
n=max(n,k+1LL); for(int i=1;i<=k;++i)t.e[1][i]=t.e[0][i]=c[i];
for(int i=2;i<=k;++i)t.e[i][i-1]=1;
t.e[0][0]=1;
Ksm(n-k-1); for(int i=1;i<=k;++i){
tmp1=(tmp1+ret.e[0][i]*b[k-i+1])%p;
}
tmp1=(tmp1+sum*ret.e[0][0])%p; t.clear();
for(int i=1;i<=k;++i)t.e[1][i]=t.e[0][i]=c[i];
for(int i=2;i<=k;++i)t.e[i][i-1]=1;
t.e[0][0]=1;
Ksm(m-k); for(int i=1;i<=k;++i)tmp2=(tmp2+ret.e[0][i]*b[k-i+1]%p)%p;
tmp2=(tmp2+sum*ret.e[0][0])%p; printf("%lld\n",(tmp2-tmp1+p)%p);
return 0;
}
}
BZOJ:3231: [Sdoi2008]递归数列的更多相关文章
- BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )
矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...
- BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂
http://www.lydsy.com/JudgeOnline/problem.php?id=3231 和斐波那契一个道理在最后加一个求和即可 #include<cstdio> #i ...
- bzoj 3231 [Sdoi2008]递归数列——矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 矩阵乘法裸题. 1018是10^18.别忘了开long long. #include& ...
- bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
今天真是莫名石乐志 一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样 然后记!得!开!long!long!! #include<iostream> #in ...
- BZOJ3231: [Sdoi2008]递归数列
BZOJ3231: [Sdoi2008]递归数列 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + ...
- BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法
BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1a ...
- 开始玩矩阵了!先来一道入门题![SDOI2008]递归数列
[SDOI2008]递归数列 题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + c ...
- P2461 [SDOI2008]递归数列
题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj 和 cj ...
- [bzoj3231][SDOI2008]递归数列——矩阵乘法
题目大意: 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
随机推荐
- C# 篇基础知识10——多线程
1.线程的概念 单核CPU的计算机中,一个时刻只能执行一条指令,操作系统以“时间片轮转”的方式实现多个程序“同时”运行.操作系统以进程(Process)的方式运行应用程序,进程不但包括应用程序的指令流 ...
- mysql文件理解
mysql_Innodb的undo_log和redo_log 原创 2014年10月28日 11:26:34 众所周知,mysql支持多种存储引擎,现在常用的是MyISAM和InnoDB.MyIS ...
- PAT (Advanced Level) 1124~1127:1124模拟 1125优先队列 1126欧拉通路 1127中序后序求Z字形层序遍历
1124 Raffle for Weibo Followers(20 分) 题意:微博抽奖,有M个人,标号为1~M.从第S个人开始,每N个人可以获奖,但是已获奖的人不能重复获奖,需要跳过该人把机会留给 ...
- Linux-hosts
Linux-hosts hosts文件 /etc/hosts OS hosts (path) 使其生效,命令行执行 Windows (C:\Windows\System32\drivers\etc\h ...
- windows清理命令
总是有一些设备需要清理,第三方的软件有不可以安装,那么,就需要这两条命令来做: cleanmgr /sageset:99 #设置要被清理的东西 cleanmgr /sagerun:99 #执行清理操作 ...
- Metasploit学习笔记——环境配置
<Metasploit渗透测试魔鬼训练营>书56页开始配置网络环境,一共五台机器,攻击机换成了自己更常用的kali,配置方法和back track相同. kali(攻击机) 10.10.1 ...
- JS浮点数的研究
为什么0.1 + 0.2 得到的是 0.30000000000000004 console.log( 0.1 + 0.2 == 0.3);//false 在js中所有的整数和小数都是以Number形式 ...
- 深入理解JVM Note
第2章 Java内存区域与内存溢出异常 运行时数据区域 在虚拟机有栈.堆和方法区. 线程共享的:堆.方法区 不共享的:栈.程序计数器(代码执行的行号) 程序计数器(Program Counter Re ...
- Day7 - G - Divisors POJ - 2992
Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you n ...
- 2 JVM 运行机制