题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^3)$,求$f_n$。$f$数组满足$f_1=f_2=\cdots=f_k=1$,$f_n=\sum\limits_{i=n-k}^{n-1}f_i$

题解:线性齐次递推:
$$
\left[
\begin{matrix}
f_1&f_2&\cdots&f_k
\end{matrix}
\right]
\left[
\begin{matrix}
0&0&0&\cdots&0&1\\
1&0&0&\cdots&0&1\\
0&1&0&\cdots&0&1\\
0&0&1&\cdots&0&1\\
\vdots&\vdots&\ddots&\ddots&\vdots&\vdots\\
0&0&0&\cdots&1&1
\end{matrix}
\right]
=
\left[
\begin{matrix}
f_2&f_3&\cdots&f_{k+1}
\end{matrix}
\right]
$$
特征多项式$G_k(x)$为:
$$
\begin{align*}
G_k(x)&=|\lambda I-A|\\
&=\left|
\left[
\begin{matrix}
\lambda&0&0&\cdots&0&-1\\
-1&\lambda&0&\cdots&0&-1\\
0&-1&\lambda&\cdots&0&-1\\
0&0&-1&\cdots&0&-1\\
\vdots&\vdots&\ddots&\ddots&\vdots&\vdots\\
0&0&0&\cdots&-1&\lambda-1
\end{matrix}
\right]\right|
\end{align*}
$$
可以对第一行展开
$$
\begin{align*}
G_k(x)&=(-1)^{1+1}\lambda G_{k-1}(x)+(-1)(-1)^{k-1}(-1)^{k+1}\\
&=\lambda G_{k-1}(x)-1\\
&=\lambda^k-\lambda^{k-1}-\lambda^{k-2}-\cdots-1
\end{align*}
$$
发现模数是$10^9+7$,但是$k$只有$10^3$,所以直接$O(k^2)$卷积和取模,总复杂度$O(k^2\log_2n)$

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#include <cstring>
#define maxn 2010
const int mod = 1e9 + 7; #define mul(x, y) static_cast<long long> (x) * (y) % mod
inline void reduce(int &x) { x += x >> 31 & mod; } int n, K;
int f[maxn], g[maxn]; void PW(int n) {
if (n == 0) { f[0] = 1; return ; }
PW(n >> 1);
std::memset(g, 0, K << 3);
for (int i = 0; i < K; ++i)
for (int j = 0; j < K; ++j)
reduce(g[i + j + (n & 1)] += mul(f[i], f[j]) - mod);
for (int i = K + K - 1 + (n & 1); i >= K; --i) {
for (int j = 1; j <= K; ++j) reduce(g[i - j] += g[i] - mod);
}
std::memcpy(f, g, K << 2);
} int main() {
scanf("%d%d", &K, &n);
PW(n - 1);
int ans = 0;
for (int i = 0; i < K; ++i) reduce(ans += f[i] - mod);
printf("%d\n", ans);
return 0;
}

  

[AT697]フィボナッチ的更多相关文章

  1. [转帖]SPARC简介

    https://www.cnblogs.com/chaohm/p/5674886.html 1.    概述 SPARC(Scalable Processor ARChitecture,可扩展处理器架 ...

随机推荐

  1. Appium+python的单元测试框架unittest(1)(转)

    unittest为python语言自带的单元测试框架,python把unittest封装为一个标准模块封装在python开发包中.unittest中常用的类有:unittest.TestCase.un ...

  2. Window10家庭版启动hyper-v虚拟机组件

    在安装docker的时候发现如果直接使用docker for windows,对系统的要求是window10专业版或企业版,家庭版本身没有hyper-v,不能支持 虚拟化.但是后来我在搜索过程中发现, ...

  3. 【Python学习笔记】正则表达式

    Ref:https://deerchao.net/tutorials/regex/regex.htm#greedyandlazy 1. 常用元字符 2.字符转义 查找元字符本身时,需要使用\来取消这些 ...

  4. node.js主从分布式爬虫

    前言 前文介绍过用Python写爬虫,但是当任务多的时候就比较慢, 这是由于Python自带的http库urllib2发起的http请求是阻塞式的,这意味着如果采用单线程模型,那么整个进程的大部分时间 ...

  5. spring boot 配置全局日期类型转换器

    1. 首先自定义一个类型转换器 import org.springframework.core.convert.converter.Converter; import org.springframew ...

  6. Flink架构分析之Standalone模式启动流程

    概述 FLIP6 对Flink架构进行了改进,引入了Dispatcher组件集成了所有任务共享的一些组件:SubmittedJobGraphStore,LibraryCacheManager等,为了保 ...

  7. ats 转发代理

    ats是一个通用代理,可配置为反向和转发代理; 转发代理可以用作基础架构中的中央工具来访问web, 它可以与缓存结合使用以降低 总体带宽使用率.转发代理充当本地网络上的客户端浏览器与这些客户端访问的所 ...

  8. Nginx笔记(一):安装

    Nginx在安装前需要先安装其所依赖的类库,所以需先行安装好之后再进行Nginx安装. Nginx依赖以下模块: l  gzip模块需要 zlib 库 l  rewrite模块需要 pcre 库 l  ...

  9. 金融科技行业 SDL(转载)

     都是一些检查项,值得借鉴,关键在于要能够落地 作者 沈发挺@美的金融科技下载打印版

  10. 解读Python编程中的命名空间与作用域

    变量是拥有匹配对象的名字(标识符).命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典.一个Python表达式可以访问局部命名空间和全局命名空间里的变量.如果一个局部变量和一个全局 ...