Description

给定数列 {hn}前k项,其后每一项满足

hn = a1h(n-1) + a2h(n-2) + ... + ak*h(n-k)

其中 a1,a2...ak 为给定数列。请计算 h(n),并将结果对 1000000007 取模输出。

Solution

常系数线性齐次递推

首先 \(A\) 的特征多项式是 \(x^k-\sum_{i=1}^{k}a_i*x^{k-i}\)

根据Cayley-Hamilton定理可以得到 \(f(A)=0\)

\(A^n=A^n\mod f(A)\)

以上并不知道怎么得来的....QwQ

于是我们可以快速幂求出 \(x^1,x^2.....x^n\) 的系数 \(c_i\),然后代入 \(A\)

最后答案就是 \(A^n*h_k=\sum_{i=0}^{k-1}c_i*A^i*h_k=\sum_{i=0}^{k-1}c_i*h_{i+k}\)

关于多项式取模法则:

如:\(5x^5+3x^4+x^3+x^2+6x+1 \mod (x^3+x^2+x+1)\)

我们先把 \((x^3+x^2+x+1)\) 乘以 \(x^2\),把被除的多项式中的 \(5x^5\) 消掉(做减法)

然后以此把次高位消掉,直到消到 \(x^3\) 为止,此题中可以 \(O(k^2)\) 暴力多项式取模

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=4010,mod=1e9+7;
int n,k,a[N],h[N],mo[N],ans[N],b[N],t[N];
inline void mul(int *a,int *b,int *c){
for(int i=2*k-2;i>=0;i--)t[i]=0;
for(int i=0;i<k;i++)
if(a[i])
for(int j=0;j<k;j++)
t[i+j]=(t[i+j]+1ll*a[i]*b[j])%mod;
for(int i=2*k-2;i>=k;i--)//多项式取模,依次消掉最高位
if(t[i])
for(int j=k-1;j>=0;j--)
t[i-k+j]=(t[i-k+j]-1ll*mo[j]*t[i]+mod)%mod;
for(int i=0;i<k;i++)c[i]=t[i];
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=k;i++)gi(a[i]),mo[k-i]=mod-a[i];
for(int i=1;i<=k;i++)gi(h[i]);
mo[k]=1;b[1]=1;ans[0]=1;
for(n-=k-1;n;n>>=1){
if(n&1)mul(ans,b,ans);
mul(b,b,b);
}
for(int i=k+1;i<=2*k-1;i++)
for(int j=1;j<=k;j++)h[i]=(h[i]+1ll*h[i-j]*a[j])%mod;
int ret=0;
for(int i=0;i<k;i++)ret=(ret+1ll*h[i+k]*ans[i])%mod;
if(ret<0)ret+=mod;
cout<<ret<<endl;
return 0;
}

bzoj 4161: Shlw loves matrixI的更多相关文章

  1. bzoj 4161 Shlw loves matrixI——常系数线性齐次递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4161 还是不能理解矩阵…… 关于不用矩阵理解的方法:https://blog.csdn.ne ...

  2. BZOJ 4161 Shlw loves matrixI ——特征多项式

    矩阵乘法递推的新姿势. 叉姐论文里有讲到 利用特征多项式进行递推,然后可以做到k^2logn #include <cstdio> #include <cstring> #inc ...

  3. bzoj 4161 Shlw loves matrixI【常系数线性齐次递推】

    并不会递推,不过板子挺好背的,只要是类似的递推都能用,但是注意c数组不能使负数 如果除了递推还有常数项的话,就用f[i]-f[i-1]的方式消掉常数项(然后多一个f[i-1]的项) #include& ...

  4. 【BZOJ4161】Shlw loves matrixI (常系数齐次线性递推)

    [BZOJ4161]Shlw loves matrixI (常系数齐次线性递推) 题面 BZOJ 题解 \(k\)很小,可以直接暴力多项式乘法和取模. 然后就是常系数齐次线性递推那套理论了,戳这里 # ...

  5. [BZOJ]4162: shlw loves matrix II

    Time Limit: 30 Sec  Memory Limit: 128 MB Description 给定矩阵 M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出. Inpu ...

  6. bzoj4161: Shlw loves matrixI

    Description 给定数列 {hn}前k项,其后每一项满足 hn = a1*h(n-1) + a2*h(n-2) + ... + ak*h(n-k) 其中 a1,a2...ak 为给定数列.请计 ...

  7. 【BZOJ4161】Shlw loves matrixI

    题目描述 给定数列 {hn}前k项,其后每一项满足 hn = a1h(n-1) + a2h(n-2) + ... + ak*h(n-k) 其中 a1,a2...ak 为给定数列.请计算 h(n),并将 ...

  8. BZOJ 3563 DZY Loves Chinese

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

  9. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

随机推荐

  1. BT Tracker的原理及.Net Core简单实现Tracker Server

    最近很忙,自上次Blog被盗 帖子全部丢失后也很少时间更新Blog了,闲暇在国外站点查阅资料时正好看到一些Tracker 的协议资料,也就今天记录并实践了下,再次分享给大家希望可以帮到需要的小伙伴. ...

  2. django admin后台的简单使用

    创建自己的model.py文件 from django.db import models from django.contrib.auth.models import ( BaseUserManage ...

  3. 一个简单的HTML病毒分析

    一直就想写这篇东西了,仅仅是上班时说要上班,不写.回家后又忙着玩游戏,丢一边去了.如今仅仅好不务正业的开写了.希望头儿不会知道我的blog.哈哈 在非常久之前就对HTML的病毒非常感兴趣了,非常好奇怎 ...

  4. mysqldump导出数据不带时区信息的问题

    今天在导出数据时,发现所有timestamp字段都不带时区信息,因为我在东8区,导出的数据中所有时间都提早了8个小时 首先先看表的字段和数据 CREATE TABLE IF NOT EXISTS `a ...

  5. Establishing SSL connection without server's identity verification is not recommended.

    完全描述:Establishing SSL connection without server's identity verification is not recommended. Accordin ...

  6. 浏览器性能接口performance.timing说明

    原文来自于 https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html 下图描述了该接口的各个时间 ...

  7. python使用python-docx导出word

    #!/usr/bin/env python # -*- coding: utf-8 -*- ''' ''' from docx import Document from docx.shared imp ...

  8. js 实现tab栏切换效果

    效果图: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. Oracle中-事务-序列-视图-数据类型笔记

    事务(Transaction) 事务(Transaction)是一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位. 事务是为了保证数据库的完整性 在o ...

  10. SQL多字段排序

    emm 其实也没什么 就是写sql查询的时候 要对多个字段排序比如  查询原本的数据是 年份 科目 批次 2014 理科 本二2015 理科 本二 2015 理科 本一2016 理科 本二 2016 ...