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

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. Jenkins学习八:Jenkins语言本地化

    在Jenkins中,英语一大片,不懂英语的看着头疼.非常高兴的是,Jenkins作为一个主流流行的持续构建工具,提供了一个本地化语言的配置界面. 你可以找到它,在Jenkins每页的左下角.如下图: ...

  2. java 21 - 8 复制文本文件的5种方式

    需求:复制文本文件 分析: 由于文本文件我们用记事本打开后可以读懂,所以使用字符流. 而字符流有5种复制的方式: 首先写main方法 public static void main(String[] ...

  3. java 16 - 5 LinkedList模拟栈数据结构的集合

    请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...

  4. Windows 2008 R2 配置 DNS 实现二级域名

    本文内容 域名解析 准备工作 安装 DNS 服务器 建立 DNS 区域 建立主机头 服务器网络设置 测试二级域名 IIS 建立 Web 站点 其他 DNS 服务 域名解析 域名解析,是域名到 IP 地 ...

  5. js对象深潜拷贝(从requirejs中抠出来的)

    var op = Object.prototype, ostring = op.toString, hasOwn = op.hasOwnProperty; function isFunction(it ...

  6. Maven 其他功能

    测试:指定测试哪些测试类,指定哪些测试类不测试,可以使用通配符 使用 Hudson 进行持续集成 持续集成:快速且高频率地自动构建项目的所有源码,并为项目成员提供丰富的反馈信息 一个典型的持续集成场景 ...

  7. 第二章 下山遇虎(@helper)

    @helper方法定义 使用@helper关键字可以定义一个方法,这样就可以在页面中调 用这个方法了,和C#中的方法一样.在页面中定义的方法可以访问ViewBag,HttpContext等等页面的属性 ...

  8. 通过HttpClient来调用Web Api接口~续~实体参数的传递

    并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对象进行传递,而这讲主要围绕这个话题来说,接口层添加一个新类User_Info,用来进行数 ...

  9. PowerDesigner打开设计文件后提示failed to read the fileXXX的解决办法

    擦,一身盗汗.一向的设计信息都在设计图里!竟然坏了,坏了!!!!! 惊.怒.悲 固然可以经由过程数据库当前状况反向工程.然则那么注解.我写的提示这些器材都邑消散. 比来的备份是10天前,恢复也会有必然 ...

  10. [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧

    简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...