BZOJ 3231: [Sdoi2008]递归数列
来源:互联网 发布:淘宝店提高销量 编辑:程序博客网 时间:2024/04/28 00:45
3231: [Sdoi2008]递归数列
Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 502 Solved: 217
[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
1 1
1 1
2 10 1000003
Sample Output
142
HINT
对于100%的测试数据:
1<= k<=15
1 <= m <= n <= 1018
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>#include <queue>#include <set>#include <algorithm>#define LL long long using namespace std;const long long MAXN = 20;long long n, m, p, k;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;}struct Matrix{ long long mat[MAXN][MAXN]; Matrix operator * (const Matrix &b) { Matrix rs;memset(rs.mat, 0, sizeof(rs.mat)); for(long long i=0;i<=k;i++) { for(long long j=0;j<=k;j++) { for(long long x=0;x<=k;x++) { (rs.mat[i][j] += (mat[i][x] * b.mat[x][j])%p) %= p; } } } return rs; }};Matrix pow_mod(Matrix a, long long b){ Matrix rs; for(long long i=0;i<=k;i++) rs.mat[i][i] = 1; while(b) { if(b & 1) rs = rs * a; a = a * a; b >>= 1; } return rs;}long long b[20], c[20];int main(){ k = read(); for(long long i=1;i<=k;i++) b[i] = read(); for(long long i=1;i<=k;i++) c[i] = read(); m = read(), n = read(), p = read(); if(n <= k) { long long l = 0, r = 0; for(long long i=1;i<m;i++) (l += b[i]) %= p; for(long long i=m;i<=n;i++) (r += b[i]) %= p; long long ans = (r - l + p) % p; while(ans < 0) ans = (ans + p) % p; printf("%lld\n", ans % p); } else { Matrix a; memset(a.mat, 0, sizeof(a.mat)); a.mat[0][0] = 1; long long sk = 0; for(long long i=1;i<=k;i++) (sk += b[i]) %= p; for(long long i=1;i<=k;i++) a.mat[0][i] = a.mat[1][i] = c[i]; for(long long i=2;i<=k;i++) a.mat[i][i-1] = 1; Matrix ma = pow_mod(a, n - k); long long r = 0; for(long long i=0;i<=k;i++) { if(i == 0) (r += ma.mat[0][0] * sk) %= p; else (r += (ma.mat[0][i] * (b[k-i+1])) % p) %= p; } long long l = 0; if(m - 1<= k) { for(long long i=1;i<m;i++) (l += b[i]) %= p; } else { Matrix mb = pow_mod(a, m - 1 - k); for(long long i=0;i<=k;i++) { if(i == 0) (l += mb.mat[0][0] * sk) %= p; else (l += (mb.mat[0][i] * b[k-i+1]) % p) %= p; } } long long ans = (r - l + p) % p; while(ans < 0) ans = (ans + p) % p; printf("%lld\n", ans % p); } return 0;}
0 0
- BZOJ 3231: [Sdoi2008]递归数列
- [bzoj 3231--SDOI2008]递归数列
- 【BZOJ】【P3231】【Sdoi2008】【递归数列】【题解】【矩阵乘法】
- 【SDOI2008】【BZOJ3231】递归数列
- bzoj3231 [Sdoi2008]递归数列
- [BZOJ3231] [Sdoi2008]递归数列
- BZOJ3231: [Sdoi2008]递归数列
- bzoj3231[Sdoi2008]递归数列
- 【bzoj3231】[Sdoi2008]递归数列(矩乘)
- 【BZOJ 3231】【CDOI 2008】递归数列
- 矩阵——洛谷P2461 [SDOI2008]递归数列
- 矩乘——BZOJ3231/Luogu2461 [Sdoi2008]递归数列
- BZOJ-3231 递归数列 矩阵连乘+快速幂
- bzoj 2656 数列sequence 递归+高精度
- BZOJ 2818 [SDOI2008] 仪仗队
- BZOJ 2190 [SDOI2008]仪仗队
- bzoj 2190: [SDOI2008]仪仗队
- BZOJ 2190: [SDOI2008]仪仗队
- 节省空间
- 现代C++ 基于范围的for和for_each语句
- #hihocoder #1081 : 最短路径·一
- jeesite dbname 问题
- 联萌十一大决战之如日中天 C. Cinderella(灰姑娘新编)
- BZOJ 3231: [Sdoi2008]递归数列
- 变量初始化规则以及声明和定义
- Android Studio 配置优化
- AVL树的思想与C++实现
- LeetCode -- Construct Binary Tree from Inorder and Postorder Traversal
- jsp实现分页和页面跳转功能
- 引擎磨合 (Break In) 的秘密
- C++中有哪些函数不能声明为虚函数
- 线程程序编译出错 undefined reference to `pthread_create'