[bzoj3231][SDOI2008]递归数列——矩阵乘法
题目大意:
一个由自然数组成的数列按下式定义:
对于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的余数的值。
题解
首先显然我们可以构造一个矩阵递推\(a_i\)。
如果直接从m递推到n,会超时(我也没写过,不知道),我们在矩阵中加一维,记录\(s_i\),具体可以见代码
注意一个问题:减法取模时应该加成正数。因为这个WA了好几次。
代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
const ll maxn = 20;
ll k, B[maxn], C[maxn], s[maxn];
ll m, n, p;
struct M {
ll n, m;
ll a[maxn][maxn];
} a, b;
M operator*(M a, M b) {
M c;
c.n = a.n;
c.m = b.m;
memset(c.a, 0, sizeof(c.a));
for (ll i = 1; i <= c.n; i++) {
for (ll j = 1; j <= c.m; j++) {
for (ll k = 1; k <= a.m; k++)
c.a[i][j] = (c.a[i][j] + (ull)(a.a[i][k] * b.a[k][j]) % p) % p;
}
}
return c;
}
M pow(M a, ll b) {
M ret;
ret.n = a.n;
ret.m = a.m;
memset(ret.a, 0, sizeof(ret.a));
for (ll i = 1; i <= ret.n; i++)
ret.a[i][i] = 1;
while (b) {
if (b & 1)
ret = ret * a;
a = a * a;
b >>= 1;
}
return ret;
}
void print(M x) {
for (ll i = 1; i <= x.n; i++) {
for (ll j = 1; j <= x.m; j++)
cout << x.a[i][j] << ' ';
cout << endl;
}
}
ll calc(ll x) {
M y = pow(a, x + 1);
// prll (y);
y = y * b;
return y.a[1][1];
}
int main() {
// freopen("input", "r", stdin);
scanf("%lld", &k);
a.n = k + 1;
a.m = k + 1;
b.n = k + 1;
b.m = 1;
s[0] = 0;
for (ll i = 1; i <= k; i++) {
scanf("%lld", &B[i]);
}
for (ll i = 1; i <= k; i++)
scanf("%lld", &C[i]);
scanf("%lld %lld %lld", &m, &n, &p);
for (ll i = 1; i <= k; i++)
s[i] = (B[i] + s[i - 1]) % p;
b.a[1][1] = s[k - 1];
for (ll i = 1; i <= k; i++)
b.a[i + 1][1] = B[k - i + 1];
a.a[1][1] = a.a[1][2] = 1;
for (ll i = 1; i <= k; i++)
a.a[2][i + 1] = C[i];
for (ll i = 1; i < k; i++)
a.a[i + 2][i + 1] = 1;
// a = a * b;
ll ans1, ans2;
// calc(1);
if (m - 1 > k)
ans1 = calc(m - 1 - k);
else
ans1 = s[m - 1];
if (n > k)
ans2 = calc(n - k);
else
ans2 = s[n];
printf("%lld\n", (ans2 - ans1 + p) % p);
return 0;
}
[bzoj3231][SDOI2008]递归数列——矩阵乘法的更多相关文章
- bzoj 3231 [Sdoi2008]递归数列——矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 矩阵乘法裸题. 1018是10^18.别忘了开long long. #include& ...
- 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂
题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
- [luogu2461 SDOI2008] 递归数列 (矩阵乘法)
传送门 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai- ...
- P2461 [SDOI2008]递归数列 矩阵乘法+构造
还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...
- BZOJ3231: [Sdoi2008]递归数列
BZOJ3231: [Sdoi2008]递归数列 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + ...
- BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )
矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...
- bzoj 3231 [ Sdoi 2008 ] 递归数列 —— 矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 裸矩阵乘法. 代码如下: #include<iostream> #incl ...
- BZOJ-3231 [SDOI2008]递归数列
转成矩阵连乘后,矩阵快速幂加速解决. 一开始没把需要longlong的变量补全..而且没初始化2333 #include <cstdlib> #include <cstdio> ...
- BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法
BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1a ...
随机推荐
- lessJs
lessJs下载地址 ======== 简介 lessJs主要提供页面切换,页面管理的一个框架:less-ui.css 和 less-ui.js 是独立于less.js的,他们提供的是一组ui,包括消 ...
- 你可能会用到的"奇技赢巧"
工作中偶尔会遇到一些不常见的问题,但是解决起来又极其麻烦,通常要找很多资料才能搞定,这里我总结了近段时间遇到的一些问题,可能会对你有帮助,高手勿喷. 1.关于iPhone最下面会弹出奇怪框框的问题 就 ...
- 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛
子串查询 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- LeetCode 410——分割数组的最大值
1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution { public: // 若分割数组的最大值 ...
- php获取微信token和ticket并返回签名
jssdk.php页,主要获取token和ticket <?php /* * 微信公众号后台里获取appId和appSecret,并在公众号后台=>安全中心=>IP白名单中设置当前页 ...
- Java基础——集合
java的集合类是一个工具类,存放在java.util包中.它不仅可以存储对象,也可以实现常用数据结构,如栈.队列等.严格的说,集合类存放的是对象的引用,而不是对象本身. java集合主要由这两个接口 ...
- Chrome Extension & Dark Theme
Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhn ...
- [Leetcode] 20. Valid Parentheses(Stack)
括号匹配问题,使用栈的特点,匹配则出栈,否则入栈,最后栈为空则全部匹配.代码如下: class Solution { public: bool isValid(string s) { stack< ...
- iOS进阶--提高XCode编译速度、Xcode卡顿解决方案
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...
- 【bzoj1123】[POI2008]BLO DFS树
题目描述 Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. 输入 输入n<=100000 ...