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 ...
随机推荐
- angularJs-服务调用与后台数据获取
可以用factory做一些后台数据的获取,例如 happyFarm.factory('seedList',['$http',function($http){ return { ge ...
- jmeter断言之响应code:200
因为Jmeter只要检测到网页的响应,就认为是Pass而并不管当前网页内容的正确性.在进行压力测试时,为了检查Web服务器返回的网页是否正确,我们可以设置断言,这些断言是验证网页上是否存在指定的Tex ...
- 数据库建表并返回给前端 - (mysql-thinkphp) (3)
1.先建一个表,你可以用mysql代码建,也可以用thinkphp建,也可以视图建,我用不到太复杂的,就用视图建了. 2.配置id为自增,唯一的值,不可重复.主键.要输入中文的选择utf8_gener ...
- Java数组去重的方法
//第一种方式:最开始想到的是利用Set集合的不可重复性进行元素过滤 public static Object[] oneClear(Object[] arr){ Set set = new Has ...
- Mozilla Firefox 68 正式发布下载:对刚Chrome
Mozilla Firefox 68开源和跨平台Web浏览器现在正式发布,可以下载适用于GNU/Linux,Mac和Windows平台的Firefox 68了. Firefox 68网络浏览器现在可以 ...
- DB2常用sql语句
转 DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操 ...
- HTML速写
1. E 代表HTML标签. 2. E#id 代表id属性. 3. E.class 代表class属性. 4. E[attr=foo] 代表某一个特定属性. 5. E{foo} 代表标签包含的内容是f ...
- 123.ModelForm的使用
ModelForm 在我们的实例中,需要通过models.py中定义相关的模型字段,之后在forms.py中同样需要定义每个字段进行相应的验证,这样的话,我们会需要重复定义,这样的话,就相对比较麻烦, ...
- eshop-环境配置
1. iptables # Generated by iptables-save v1. :: #*filter #:INPUT ACCEPT [:] #:FORWARD ACCEPT [:] #:O ...
- php中date('Y/m/d',time())显示不对
一. 时间不对是因为没设置时区 在xampp/php/php.ini中ctrl + f 查找date.timezone 该行默认注释,去掉 ; 修改为 date.timezone = PRC 二 上述 ...