zoj 3772 Calculate the Function monthly 14th
来源:互联网 发布:电子秤数据倒显 编辑:程序博客网 时间:2024/05/29 09:43
题意:
给一个数组A[1,2,...,n]和m个查询l,r
对于每一个查询,
1 <= A[i] <= 10^9
1 <= n,m <= 10^5
每一步骤均对 MOD = 10^9+7 取模
方法一:复杂度O(n+m*log(MOD))
看到递推公式,不难想到递推公式
当我们给一个查询L,R时,
这里解矩阵[X]有两种方法:
(1)建立二元同余方程组(由于每次取模,所以是同余方程组而不是方程组)
(2)[X] = matrix[R] * matrix[L+1](-1),求逆再相乘
对于(1),可以用用扩展欧几里得解出(写出来有BUG。。。)
对于(2),2*2矩阵的逆:
(写出来很快。。)
方法二:O(nlog(n)+mlog(n))
线段树的方法,记
给一个数组A[1,2,...,n]和m个查询l,r
对于每一个查询,
F[l] = A[l]F[l+1] = A[l+1]F[x] = F[x-1] + A[x]*F[x-2], x >= l+2求F[r]。
1 <= A[i] <= 10^9
1 <= n,m <= 10^5
每一步骤均对 MOD = 10^9+7 取模
方法一:复杂度O(n+m*log(MOD))
看到递推公式,不难想到递推公式
[F[n+2]] = [1 A[n+2]] * [F[n+1]] = ... = [1 A[n+2]] * [1 A[n+2]] * ... * [1 A[3]] * [F[2]][F[n+1]] [1 0 ] [F[n] ] [1 0 ] [1 0 ] [1 0 ] [F[1]]记
matrix[n] = [1 A[n]] * [1 A[n-1]] * ... * [1 A[3]] [1 0 ] [1 0 ] [1 0 ]
其中n>=3,matrix[n]是一个2*2的矩阵
则
[F[n] ] = matrix[n] * [F[2]][F[n-1]] [F[1]]其中n>=3
当我们给一个查询L,R时,
[F[R] ] = matrix[R] * [f[2]][F[R-1]] [f[1]][F[L+1]] = matrix[L+1] * [f[2]][F[L] ] [f[1]]要求2*2的矩阵[X]使得,
[f[R] ] = [X] * [f[L+1]][f[R-1]] [f[L] ]等价于
matrix[R] * [f[2]] = [X] * matrix[L+1] * [f[2]] [f[1]] [f[1]]所以应该是 matrix[R] = [X] * matrix[L+1]
这里解矩阵[X]有两种方法:
(1)建立二元同余方程组(由于每次取模,所以是同余方程组而不是方程组)
(2)[X] = matrix[R] * matrix[L+1](-1),求逆再相乘
对于(1),可以用用扩展欧几里得解出(写出来有BUG。。。)
对于(2),2*2矩阵的逆:
[a b]-1 = 1/(ad-bc) * [d -b][c d] [-c a]然而,模运算不支持除法,但是,除以一个数x在MOD下等价于乘以逆元x^(MOD-2)
(写出来很快。。)
方法二:O(nlog(n)+mlog(n))
线段树的方法,记
M[n] = [1 A[n]] [1 0 ]显然,
[F[R] ] = M[R] * ... * M[L+2] * [F[L+1]][F[R-1]] [F[L] ]为了方便求出M[R] * ... * M[L+2],可以建立线段树
0 0
- zoj 3772 Calculate the Function monthly 14th
- ZOJ 3772 Calculate the Function
- ZOJ 3772 Calculate the Function
- zoj 3772 Calculate the Function
- ZOJ 3772 Calculate the Function( 线段树 )
- ZOJ 3772 Calculate the Function 解题报告
- zoj 3772 Calculate the Function(矩阵乘法)
- ZOJ 3772Calculate the Function(线段树)
- ZOJ 3772 —— Calculate the Function(矩阵乘法)
- zoj-3772-Calculate the Function-线段树+矩阵
- ZOJ Problem Set - 3772 Calculate the Function 矩阵+线段树
- zoj 3772 Calculate the Function 线段树+矩阵
- ZOJ 3772 Calculate the Function(线段树 + 矩阵)
- ZOJ 3772 Calculate the Function (线段树 + 矩阵)
- [矩阵+线段树] zoj 3772 Calculate the Function
- zoj 3772 Calculate the Function 矩阵相乘+ 线段树查询
- zoj 3772 Calculate the Function(矩阵+线段树)
- zoj 3772 Calculate the Function(线段树+矩阵乘法)
- Java变量
- Java知识点列表
- 程序员的“横向发展”
- Java类的生命周期
- 解决Android手机root仍然出现adbd connot run as root in production build
- zoj 3772 Calculate the Function monthly 14th
- Java对象的生命周期
- Java内部类的概念
- Java开发环境
- 黑马程序员 Java面向对象——(匿名)内部类
- 微软编程之美传话游戏、长方形 Java实现
- mongo基本用法
- Java数组的概念
- Iterator(迭代子)