【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 ...
随机推荐
- mint-ui loadmore 上拉加载的坑
<div style="height:100vh;overflow: scroll;"> <mt-loadmore :top-method="loadT ...
- minifilter 算是总结吧
FltRegisterFilter 注册过滤器 FltStartFiltering 开始过滤 InstatanceSetupCallback 实例安装回调 .当一个微过滤器加载的时候,每个存在的卷都会 ...
- CSRF spring mvc 跨站请求伪造防御(转)
CSRF CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一 ...
- spring自定义bean工厂模式解耦
在resources下创建bean.properties accountService=cn.flypig666.service.impl.AccountServiceImpl accountDao= ...
- 【笔记篇】C#笔记2
返回目录:目录请戳这里~ C#数组 基本概念不提.. int[] a; bool[] b = new bool[10]; float[] c = {0.5, 57.0, 233.3, 12345.67 ...
- 筛法求欧拉函数(poj2478
求1-n的欧拉函数的值 #include <iostream> #include <cstdio> #include <queue> #include <al ...
- leetcode-第5周双周赛-1135-最低成本联通所有城市
方法一: class Solution: def minimumCost(self, N: int, conections: List[List[int]]) -> int: def find( ...
- 牛客网在线判题系统JavaScript(V8)使用
JavaScript作为一种弱类型的编程语言,语法和C/C++.JAVA等存在差别,但是对于大部算法题,不只是C/C++.JAVA,也依然可以使用JavaScript来实现.所以在牛客网中,如果你喜欢 ...
- 杂项-公司:Amazon
ylbtech-杂项-公司:Amazon 亚马逊公司(Amazon,简称亚马逊:NASDAQ:AMZN),是美国最大的一家网络电子商务公司,位于华盛顿州的西雅图.是网络上最早开始经营电子商务的公司之一 ...
- 6大主流开源SQL引擎总结,遥遥领先的是谁?
根据 O’Reilly 2016年数据科学薪资调查显示,SQL 是数据科学领域使用最广泛的语言.大部分项目都需要一些SQL 操作,甚至有一些只需要SQL.本文就带你来了解这些主流的开源SQL引擎!背景 ...