bzoj 3231 & 洛谷 2461 题解(Flag=1)

题意简述

(纯代数)定义数列 a i = a_i= ai=
{ b i                  ( i < = k ) ∑ j = 1 k a i − j c j      ( i > k ) ( b i , c i < = 1 0 9 ) \begin{cases} b_i\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (i<=k)\\ \\ \\ \sum\limits_{j=1}^{k} a_{i-j}c_j\ \ \ \ (i>k) \end{cases}\\ (b_i,c_i<=10^{9}) bi                (i<=k)j=1kaijcj    (i>k)(bi,ci<=109)
a a a数组从 m m m n ( m , n < = 1 0 18 ) n(m,n<=10^{18}) n(m,n<=1018)的和模 p ( p < = 1 0 8 ) p(p<=10^8) p(p<=108)的值,也就是 ∑ i = m n a i % p \sum\limits_{i=m}^{n}a_i\%p i=mnai%p

数据

输入
2
1 1
1 1
2 10 1000003
输出
142

思路

一个朴素的思路:暴力递推。
发现 n , m n,m n,m的数据是 1 0 18 10^{18} 1018,显然会 T L E TLE TLE
所以需要一个很快的算法,要么是矩阵快速幂,要么是玄学的 O ( 1 ) O(1) O(1)公式。明显, k k k很大(会到 15 15 15),所以公式是没有的。需要矩阵快速幂的做法。
(矩阵快速幂目前还没写博客,留一个 F l a g Flag Flag在这里)
现在设 C a l c ( x ) Calc(x) Calc(x)为求 a 1 a_1 a1 a x a_x ax的和,那么答案= C a l c ( n ) − C a l c ( m − 1 ) Calc(n)-Calc(m-1) Calc(n)Calc(m1)(以下省略取模)。
考虑如何求 C a l c ( x ) Calc(x) Calc(x)
我们要求的是一段前缀和,而不是具体一项。
wdnmd这怎么求???
想想发现,我们珂以在矩阵里面顺便维护上和啊!!!

那么我们的矩阵就是一个 1 × ( k + 1 ) 1\times (k+1) 1×(k+1)的矩阵,前面 k k k个是当前的 a a a值,第 k + 1 k+1 k+1个是和。然后每次乘一个 ( k + 1 ) × ( k + 1 ) (k+1)\times (k+1) (k+1)×(k+1)的矩阵转移,最后取第一行第 k + 1 k

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值