博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[AT697]フィボナッチ
阅读量:6499 次
发布时间:2019-06-24

本文共 1838 字,大约阅读时间需要 6 分钟。

题目大意:给你$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 
#include
#include
#define maxn 2010const int mod = 1e9 + 7;#define mul(x, y) static_cast
(x) * (y) % modinline 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;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10398167.html

你可能感兴趣的文章
MySQL 语句整理 2019-5-3
查看>>
html5新标签使用
查看>>
compass安装使用960 Grid System
查看>>
关于小数的精确运算
查看>>
20175203 2018-2019 实验五《网络编程与安全》
查看>>
Eureka服务注册中心
查看>>
轻松记账工程冲刺第二阶段10
查看>>
分离导航模块
查看>>
Lighttpd1.4.20源代码分析 笔记 状态机之错误处理和连接关闭
查看>>
php代码中使用换行及(\n或\r\n和br)的应用
查看>>
高考估分查分选志愿一键搞定_支付宝又操办了件人生大事
查看>>
HTML中的form表单有一个关键属性 enctype
查看>>
LeetCode-135-Candy
查看>>
制作RPM包
查看>>
beego数据输出
查看>>
DecimalFormat
查看>>
如何在同一系统里同时启动多个Tomcat
查看>>
Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)
查看>>
java显示本地磁盘所有盘符,显示桌面路径
查看>>
对Cost (%CPU) 粗略的理解
查看>>