题不是很难,但是啊,人很傻啊。。。机子也很鬼畜啊。。。

3231: [Sdoi2008]递归数列

Time Limit: 1 Sec Memory Limit: 256 MB

Submit: 569 Solved: 241

[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

Source

第一次调试:矩阵都是【1001】【1001】虽然很多余,但是理论上并没错,但是机子low每次调用到就炸....
第二次调试:矩阵的初始化调上次时不小心删了....又WA....
第三次调试:出现负数,以为爆longlong果断+快速乘,still booming
然后发现是最后做前缀和减法时..可能减到负了.....
于是A之,带快速乘版本1600MS+,删之160MS+....珍爱生命远离快速乘TAT

构造的矩阵如下:



S为前缀和…最后只需要进行前缀和相减即可…

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long read()
{
long long x=0,f=1; char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} long long k,m,n,p;
long long s=0;
long long cc[50],bb[50];
struct Mat{
long long da[50][50];
Mat(){memset(da,0,sizeof(da));}
}; //long long quick_mul(long long x,long long y)
//{
// if (y==0) return 0;
// if (y==1) return x%p;
// long long re;
// re=quick_mul(x,y>>1);
// if ((y&1)==1) return (re+re+x)%p;
// else return (re+re)%p;
//} Mat mul(Mat A,Mat B)
{
Mat C;
for (int i=1; i<=k+1; i++)
for (int j=1; j<=k+1; j++)
for (int kk=1; kk<=k+1; kk++)
C.da[i][j]=(C.da[i][j]+(A.da[i][kk]*B.da[kk][j])%p)%p;
return C;
} Mat quick_pow(Mat A,long long x)
{
Mat re;
for (int i=1; i<=k+1; i++) re.da[i][i]=1;
for (long long i=x; i; i>>=1,A=mul(A,A))
if (i&1) re=mul(re,A);
return re;
} Mat a;
Mat b;
void init()
{
for (int i=1;i<=k;i++) a.da[i][1]=a.da[i][k+1]=cc[i];
for (int i=2;i<=k;i++) a.da[i-1][i]=1;
a.da[k+1][k+1]=1;
for (int i=1;i<=k;i++) b.da[1][i]=bb[k-i+1];
b.da[1][k+1]=s;
} long long work(long long x)
{
if (x==0) return b.da[1][k+1];
Mat re;
re=quick_pow(a,x);
re=mul(b,re);
return re.da[1][k+1];
} int main()
{
k=read();
for (int i=1; i<=k; i++) bb[i]=read();
for (int i=1; i<=k; i++) cc[i]=read();
m=read(),n=read(),p=read();
for (int i=1; i<=k; i++) bb[i]%=p,s=(s+bb[i])%p,cc[i]%=p;
long long ans=0;
if (n<=k)
{
for (int i=m; i<=n; i++) ans=(ans+bb[i])%p;
printf("%lld\n",ans);
return 0;
}
init();
ans=work(n-k);
if (m>k) ans=(ans-work(m-k-1))%p;
else for (int i=1; i<m; i++) ans=(ans-bb[i])%p;
ans=(ans+p)%p;
printf("%lld\n",ans);
return 0;
}

BZOJ-3231 递归数列 矩阵连乘+快速幂的更多相关文章

  1. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  2. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

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

    矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...

  4. 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂

    题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj  ...

  5. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  6. bzoj 3240 矩阵乘法+十进制快速幂

    首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...

  7. P2461 [SDOI2008]递归数列 矩阵乘法+构造

    还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...

  8. HDU1575Tr A(矩阵相乘与快速幂)

    Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...

  9. poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Descri ...

随机推荐

  1. AC日记——热浪 codevs 1557 (最短路模板题)

    1557 热浪  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 德克萨斯纯朴的民眾们这个夏 ...

  2. ubuntu 命令收集

    1. ctrl + Alt + F1:   进入纯粹的命令行. 2. ctr + Alt + T :    从图形界面打开终端.

  3. 对访问修饰关键字public, protected, internal and private的说明

    对访问修饰关键字public, protected, internal and private的说明1.msdn: Internal types or members are accessible o ...

  4. iOS开发之----常用函数和常数

    介绍一下Objective-c常用的函数,常数变量 算术函数 [算术函数] 函数名 说明 int rand() 随机数生成.(例)srand(time(nil)); //随机数初期化int val = ...

  5. prepareStatement createStatement

    preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement. preparedstatemen ...

  6. 07Mybatis_入门程序——根据前面的做的两个查询联系,做一些小的总结

    总结如下: 1.parameterType和resultType 在映射文件中通过parameterType指定输入 参数的类型. 在映射文件中通过resultType指定输出结果的类型. 例如: & ...

  7. Django1.10环境安装

    在Ubuntu14上 一 安装脚本 wget https://github.com/django/django/archive/master.tar.gz apt-get install python ...

  8. Maximal Square

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  9. [转]SQLServer跨服务器访问数据库(openrowset/opendatasource/openquery)

    正 文: 1.启用Ad Hoc Distributed Queries 在使用openrowset/opendatasource前搜先要启用Ad Hoc Distributed Queries服务,因 ...

  10. Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写

    深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成.Caffe就是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型.它将所有的信息数据定义为blob ...