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

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. AppScan8.0简单扫描

    上篇文章介绍了如何在WindowsXP中安装AppScan8.0,接着本篇就来说说怎么进行一次简单的扫描吧. AppScan8.0开始扫描 1.新建扫描,选择“常规扫描”,如下图: (常规.快速.综合 ...

  2. SVN版本回退

    [SVN版本回退] 在Windows里,先打开Log面板,根据想要回退的内容,然后选择revert to this revision或者revert changes from this revisio ...

  3. meate 标签使用介绍

    //禁止浏览器从本地计算机的缓存中访问内容 <meta http-equiv="pragma" content="no-cache"> //清楚缓存 ...

  4. Gerrit日常操作命令收集

    Gerrit代码审核工具是个好东西,尤其是在和Gitlab和Jenkins对接后,在代码控制方面有着无与伦比的优势. 在公司线上部署了一套Gerrit系统,在日常运维中,使用了很多gerrit命令,在 ...

  5. 5050 [JL] 他爱上了鸭蛋

    5050 [JL] 他爱上了鸭蛋  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 小明爱上了零鸭蛋.他喜欢输 ...

  6. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。

    尝试了很多种方案,由于Datagrid动态生成的每行父子comboBox的Name的不确定性,给父ComboBox绑定事件中获取 子ComboBox很难根据Name获取到. 花了不少时间和公司同事商讨 ...

  7. sudo权限添加 和 rpm、deb之名词解释

    sudo权限添加: 刚开始用Center_os Linux操作系统,想装个输入法,搜了一下,看到linux下的搜狗输入法(帖子链接)下载下来的文件的扩展名是.deb,直接用帖子上的一个命令: sudo ...

  8. .NET编译的目标平台(AnyCPU,x86,x64)

    转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...

  9. HTML基础 - <base>标签的使用

    标签对于不是很熟悉前端的人应该还算是个生面孔吧,粗略讲讲标签的用法. 将相对路径变成绝对路径 这个对于需要借(chao)鉴(xi)别人网页的时候特别有用~ 批量设置target=_blank 当需要对 ...

  10. 【转】Python Twisted介绍

    Python Twisted介绍 作者:Jessica McKellar 原文链接 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开 ...