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

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

#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. LCP Array(思维)

    LCP Array Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  2. HDU 1134 卡特兰数 大数乘法除法

    Problem Description This is a small but ancient game. You are supposed to write down the numbers 1, ...

  3. 【玩转Ubuntu】01. Ubuntu上配置JDK

    一.安装JDK 提示:这里我们使用jdk1.6,因为android开发要求使用1.6.如果不信你可以打开android studio,它会提示你选择JDK6的路径 下载地址: http://www.o ...

  4. Thrift使用实例

    首先下载thrift.exe,和对应lib包.注意版本一定要一致. 否则编译会不识别出现错误. 可能会出现org.slf4j这个错误,那么你要把slf4j-api.jar下载下来引入到你的projec ...

  5. for应用

    应用:迭代法,穷举法.一.迭代法:有一定规律. 每次循环都是从上次运算结果中获得数据,本次运算的结果都是要为下次运算做准备.例:1.100以内所有数的和.2.求阶乘3.求年龄.4.折纸.5.棋盘放粮食 ...

  6. PHP与MySQL交互

    <?php $con = mysql_connect("localhost","root","12345"); $dbcharset ...

  7. 为什么用户主目录下.bash_profile没有自动执行

    请注意 一般登录当前用户后 .bash_profile会自动运行 如果不自动运行请查看是不是切换用户的时候使用的su 用户名而不是su - 用户名 添加中间这个 - 后 会除了切换用户外还会加载该用户 ...

  8. 关于智能指针auto_ptr

    智能指针auto_ptr和shared_ptr也是面试中经常被问到的一个 感觉看auto_ptr的源码反而更加容易理解一些,因为源码的代码量并不大,而且比较容易理解. 本篇主要介绍auto_ptr 其 ...

  9. “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)

    解决方案: “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载) 遇到的问题: 在.h头文件中采用namespace 命名空间报错 test.h namespace LMR ...

  10. 《C++ Primer Plus 6th》读书笔记 - 第8章 函数探幽

    1. 摘录 默认参数指的是当函数调用中省略了实参时自动使用的一个值. 默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式.使用默认参数,可以减少要定义的析构函数.方法以及方法重载的数量. 试图 ...