【BZOJ4161】Shlw loves matrixI
题目描述
给定数列 {hn}前k项,其后每一项满足
hn = a1h(n-1) + a2h(n-2) + ... + ak*h(n-k)
其中 a1,a2...ak 为给定数列。请计算 h(n),并将结果对 1000000007 取模输出。
解法
一个显然的思路就是矩阵乘法,但这样的话显然超时。
实际上,我们还可以继续对这个矩阵乘法进行优化。
首先,由于这是常系数齐次线性递推式,简单来说就是:
\]
然后,我们需要引进特征多项式这个概念。
对于一个矩阵\(A\),它的特征多项式是\(f(x)=|Ix-A|\)
把行列式展开之后得,\(f(x)=|Ix-A|=x^K-\sum_{i=1}^K a_i*x^{K-i}\)
由Cayley-hamilton定理,那么我们知道\(f(A)=0\)
然后就能知道一个关键的式子:
\]
然后由于\(A^i\)都能表示成\(A^1,A^2,....,A^K\)的线性组合,
所以现在矩阵乘法直接使用\(O(K^2)\)的卷积即可。
当得到了\(A^n=\sum_{i=1}^K c_i*A^i\)之后,我们乘上题目给的向量h。
那么就会有\(\sum_{i=1}^K c_i*A^i*h_K\),即\(Ans=\sum_{i=1}^K c_i*h_{K+i}\)。
复杂度就被优化为\(O(K^2 log n)\)
Code
#include<bits/stdc++.h>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const int maxn=4007,mo=1e9+7;
int n,K;
int a[maxn],h[maxn],f[maxn];
int Ans;
void Init(){
scanf("%d%d",&n,&K);
fo(i,1,K) scanf("%d",&a[i]);
memcpy(f,a,sizeof a);
fo(i,1,K) scanf("%d",&h[i]);
}
#define PLUS(x,y) (x)=((x)+(y))%mo
void mult(int *a,int *b){
static int c[maxn];
memset(c,0,sizeof c);
fo(i,1,K)
fo(j,1,K)
PLUS(c[i+j],1ll*a[i]*b[j]);
fd(i,2*K,K+1)
fo(j,1,K)
PLUS(c[i-j],1ll*c[i]*f[j]);
memcpy(a,c,sizeof c);
}
void qPower(int x){
bool bz=false;
static int b[maxn];
b[1]=1;
while (x){
if (x&1){
if (bz) mult(a,b);
else{
bz=true;
memcpy(a,b,sizeof b);
}
}
mult(b,b);
x>>=1;
}
}
void Solve(){
n++;
fo(i,K+1,2*K) fo(j,1,K) PLUS(h[i],1ll*h[i-j]*a[j]);
if (n<=2*K){
Ans=h[n];
return;
}
qPower(n-K);
Ans=0;
fo(i,1,K) PLUS(Ans,1ll*a[i]*h[i+K]);
}
void Print(){
Ans=(Ans+mo)%mo;
printf("%d\n",Ans);
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
Init();
Solve();
Print();
return 0;
}
【BZOJ4161】Shlw loves matrixI的更多相关文章
- 【BZOJ4161】Shlw loves matrixI (常系数齐次线性递推)
[BZOJ4161]Shlw loves matrixI (常系数齐次线性递推) 题面 BZOJ 题解 \(k\)很小,可以直接暴力多项式乘法和取模. 然后就是常系数齐次线性递推那套理论了,戳这里 # ...
- 【Luogu3602】Koishi Loves Segments(贪心)
[Luogu3602]Koishi Loves Segments(贪心) 题面 洛谷 题解 离散区间之后把所有的线段挂在左端点上,从左往右扫一遍. 对于当前点的限制如果不满足显然会删掉右端点最靠右的那 ...
- 【BZOJ3561】DZY Loves Math VI (数论)
[BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...
- 【CF446D】DZY Loves Games 高斯消元+矩阵乘法
[CF446D]DZY Loves Games 题意:一张n个点m条边的无向图,其中某些点是黑点,1号点一定不是黑点,n号点一定是黑点.问从1开始走,每次随机选择一个相邻的点走过去,经过恰好k个黑点到 ...
- 【BZOJ3309】DZY Loves Math(莫比乌斯反演)
[BZOJ3309]DZY Loves Math(莫比乌斯反演) 题面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)表示\(x\)分解质因 ...
- 【BZOJ3512】DZY Loves Math IV(杜教筛)
[BZOJ3512]DZY Loves Math IV(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\] 其中\(n\le 10^5,m\l ...
- 【BZOJ3309】DZY Loves Math 解题报告
[BZOJ3309]DZY Loves Math Description 对于正整数\(n\),定义\(f(n)\)为\(n\)所含质因子的最大幂指数.例如\(f(1960)=f(2^3×5^1×7^ ...
- 【BZOJ3316】JC loves Mkk 分数规划+单调队列
[BZOJ3316]JC loves Mkk Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整 ...
- 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)
[BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...
随机推荐
- js 盒子模型与盒子偏移量
js 盒子模型: 通过js中提供的一系列属性和方法获取页面中元素的样式信息值. 一.client系类—>只读属性不可设置 (当前元素的私有属性,和内容溢出没关系,如果给容器设置了高度,就采用设置 ...
- day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数
20180729 补充部分代码 20180727 上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...
- wpf 几种常用控件样式
转自:http://blog.csdn.net/xuejiren/article/details/39449515
- ORM下实现继承的三种方式(TPH TPC TPT)
TPH(Table Per Hierarchy):所有的数据都放在同一个表格内,但是使用辨别标志(Discriminator)的方式来区分 TPC(Table Per Concrete-Type):由 ...
- java_IO流(输入流)
* 字节输入流(InputStream):所有字节输入流的父类 * 所有子类共性方法: * int read():从输入流中读取数据的下一个字节 * int read(byte[] b):从输入流中拂 ...
- 在 /proc 里实现文件
所有使用 /proc 的模块应当包含 <linux/proc_fs.h> 来定义正确的函数. 要创建一个只读 /proc 文件, 你的驱动必须实现一个函数来在文件被读时产生数据. 当 某个 ...
- [笔记]180612 for DevOps
adb devices 识别不了安卓手机:我下的adb interface驱动下载链接:如果设备管理器中ADB Interface是黄色的,就需要先安装adb interface驱动(BD:adb i ...
- [JZOJ5233] 【GDOI模拟8.5】概率博弈
题目 题目大意 给你一棵树,这棵树上的所有叶子节点的权值是随机的排列. 两个人博弈,从根开始,轮流往下走. 先手希望权值最大,后手希望权值最小. 问期望的最终结果. 思考历程 这场比赛实在是太丧心病狂 ...
- UOJ450 复读机
题意:n个位置,k种颜色.求有多少种方案使得每种颜色恰出现d的倍数次. 解:d=1就快速幂,n,k很小就DP,记得乘组合数来分配位置. d = 2 / 3的时候,考虑生成函数. f(x) = ∑[d ...
- Python-进程(2)
目录 进程互斥锁 队列 堆栈 IPC(进程间通信) 生产者与消费者模型 进程互斥锁 通过之前的学习,我们千方百计的实现了程序的异步,让多个任务可以同时在几个进程中并发处理 他们之间的运行没有顺序,一旦 ...