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

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

#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. Qemu之Network Device全虚拟方案二:虚拟网卡的创建

    上文针对Qemu在前端网络流路径的建立方面做了具体的描写叙述.数据包从Host的物理网卡经过Host Linux内核中的Bridge, 经过Tap设备到达了Qemu的用户态空间.而Qemu是怎样把数据 ...

  2. EC读书笔记系列之8:条款13、14、15

    条款13 以对象管理资源 记住: ★为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放 ★两个常被使用的RAII classes分别是tr1::shared_ptr和aut ...

  3. QF——UITableViewCell性能优化(视图复用机制)

    这几篇博客总结的不错: 点击进入 点击进入 总结起来方案一般有以下几种: 1.不使用透明视图: 2.减少视图的个数: 3.cell复用机制:(重点) 4.图片缓存: 5.网络请求使用非主线程. 6.预 ...

  4. OC语法3——点语法,self关键字

    点语法:   为了给程序员提供便捷,OC中也引入了点语法.不过它和Java中点语法的意义是完全不同的. 在Java中无论调用任何方法,还是访问public类型的成员变量都是用点语法(.号). 而在OC ...

  5. Why Study JavaScript?

    JavaScript is one of the 3 languages all web developers must learn: 1. HTML to define the content of ...

  6. 对原生js的一些小尝试

    意图仿造JQ操作以及弄个个人工具箱,不断完善中,代码均为个人摸索,所以肯定会有不少不足的地方,希望读者们能提出来. var xzhUtils = { //-----DOM对象添加类----- //-- ...

  7. Vnstat: 简单实用的网络流量统计工具

    官方主页: http://humdi.net/vnstat # Ubuntu 安装: (其本上其它发行版的包管理程序中也都包含了这款软件,请自行安装) sudo apt-get install vns ...

  8. vijos 1067 Warcraft III 守望者的烦恼 矩阵

    题目链接 我们可以很容易的推出dp的式子, dp[i] = sigma(j : 1 to k) dp[i-j]. 但是n太大了, 没有办法直接算, 所以我们构造一个矩阵, 然后快速幂就好了. 就像这样 ...

  9. java设计模式之 单例模式 Singleton

    static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...

  10. Oracle EBS-SQL (SYS-13):查询DBA在系统中的打Patch的信息.SQL

    查询DBA在系统中的打补丁信息 1. select * from ad_patch_drivers          /*查看已经打了哪些Patch*/ 2. select * from ad_pat ...