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

---------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
const int maxn = 20;
 
typedef long long ll;
typedef int mat[maxn][maxn];
 
ll n, m;
int p, k, ans, sm;
int b[maxn], c[maxn];
mat Q, res, tmp;
 
inline void upd(int &x, int t) {
if((x += t) >= p) x -= p;
if(x < 0) x += p;
}
 
void Init() {
ans = sm = 0;
scanf("%d", &k);
for(int i = 0; i < k; i++)
scanf("%d", b + i);
for(int i = 0; i < k; i++)
scanf("%d", c + i);
scanf("%lld%lld%d", &m, &n, &p);
for(int i = 0; i < k; i++)
upd(sm, b[i]);
}
 
void makeMatrix() {
Q[0][0] = 1;
Q[1][0] = 0;
for(int i = 1; i <= k; i++)
Q[0][i] = Q[1][i] = c[i - 1];
for(int i = 2; i <= k; i++)
for(int j = 0; j <= k; j++)
Q[i][j] = (j + 1 == i);
for(int i = 0; i <= k; i++)
for(int j = 0; j <= k; j++)
res[i][j] = (i == j);
}
void Mult(mat &a, mat b) {
for(int i = 0; i <= k; i++)
for(int j = 0; j <= k; j++)
tmp[i][j] = 0;
for(int i = 0; i <= k; i++)
for(int v = 0; v <= k; v++)
for(int j = 0; j <= k; j++)
upd(tmp[i][j], ll(a[i][v]) * b[v][j] % p);
for(int i = 0; i <= k; i++)
for(int j = 0; j <= k; j++)
a[i][j] = tmp[i][j];
}
 
int calc(ll x) {
makeMatrix();
x -= k;
for(; x; x >>= 1, Mult(Q, Q))
if(x & 1) Mult(res, Q);
int ret = 0;
upd(ret, ll(res[0][0]) * sm % p);
for(int i = 1; i <= k; i++)
upd(ret, ll(res[0][i]) * b[k - i] % p);
return ret;
}
 
void Work() {
if(--m <= k) {
for(int i = 0; i < m; i++)
upd(ans, -c[i]);
} else
upd(ans, -calc(m));
upd(ans, calc(n));
printf("%d\n", ans);
}
 
int main() {
Init();
Work();
return 0;
}

---------------------------------------------------------------------------------

3231: [Sdoi2008]递归数列

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 526  Solved: 229
[Submit][Status][Discuss]

Description

HINT

对于100%的测试数据:

1<= k<=15

1 <= m <= n <= 1018

Source

BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )的更多相关文章

  1. bzoj 3231 [Sdoi2008]递归数列——矩阵乘法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 矩阵乘法裸题. 1018是10^18.别忘了开long long. #include& ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=3231   和斐波那契一个道理在最后加一个求和即可 #include<cstdio> #i ...

  3. bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】

    今天真是莫名石乐志 一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样 然后记!得!开!long!long!! #include<iostream> #in ...

  4. HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  5. POJ3070 斐波那契数列 矩阵快速幂

    题目链接:http://poj.org/problem?id=3070 题意就是让你求斐波那契数列,不过n非常大,只能用logn的矩阵快速幂来做了 刚学完矩阵快速幂刷的水题,POJ不能用万能头文件是真 ...

  6. hdu4549 M斐波那契数列 矩阵快速幂+快速幂

    M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...

  7. 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

  8. BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

    矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...

  9. BZOJ 2326 数学作业(分段矩阵快速幂)

    实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...

随机推荐

  1. Linux 下编译Android-VLC开源播放器详解(附源码下载)

    这两天需要做音视频播放相关的东西,所以重新找了目前android下的解码库.Android自带的解码库支持不全,因此很多第三方播放器都是自带解码器,绝大部分都是使用FFMpeg作为解码库.我11年的时 ...

  2. java基础之高级应用

    在程序中涉及方法重写的地方使用@override Annotation(只作用于方法)注释可以很好的避免由于重写方法名字过长而造成的程序后期出现的难以调试的错误,特别是程序没有报任何的错误时,而程序的 ...

  3. NotificationManager 发送通知

    该应用的界面如下,界面代码在此不再给出,源码github账户下载 MainActivity.java public class MainActivity extends Activity { priv ...

  4. 【转】CodeGear RAD 2007 SP4

    转自:http://blog.csdn.net/Rzhghost/article/details/2512150 CodeGear RAD 2007 up4最新下载及破解 官方http下载:http: ...

  5. @synthesize 与@dynamic区别

    @synthesize 除非开发人员已经做了,否则由编译器自动生成getter/setter方法. 当开发人员自定义存或取方法时,自定义会屏蔽自动生成该方法. @dynamic 告诉编译器,不自动生成 ...

  6. #import和#include的区别 关键字@class的作用

    一.#import和#include的区别当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误但是使用两次#import的话,不 ...

  7. HTTP头信息(转)--2

    HTTP 头部解释 ========================================================================================== ...

  8. cocos2dx新建工程分析

    这里我新建了一个cocos的工程叫做hello,没有的自己翻上一页教程 运行一下  出来是这个样子的: 左下角是帧频,可以设置显示或是不显示,中间是图片精灵,右下角是关闭按钮,然后上面是一个hello ...

  9. mysql服务端安装的系列问题处理

    1.mysql服务无法启动,报1067错误 注意:mysql服务端加压之后的文件名最好不要带其他符号(如:"_"之类等其他的一些符号),用纯英文跟数字就可以,没有经过仔细验证带符号 ...

  10. [转]前端CSS规范整理

    一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core  通用 ...