题目大意:给你$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. c语言数字图像处理(七):频率域滤波

    代码运行了两个小时才出的结果,懒得测试了,这一部分先鸽了,等对DFT算法进行优化后再更

  2. trampoline蹦床函数解决递归调用栈问题

    递归函数的调用栈太多,造成溢出,那么只要减少调用栈,就不会溢出.怎么做可以减少调用栈呢?就是采用"循环"换掉"递归". 下面是一个正常的递归函数. functi ...

  3. Ubuntu下配置Anaconda

    转自:https://blog.csdn.net/Horcham/article/details/57075388 安装Anaconda Ubuntu下似乎库中不自带Anaconda,是自带纯净的py ...

  4. Overlay 网络

  5. [linux] 查看网卡UUID

    virtualbox复制了虚拟机,重新初始化网卡后,需要对/etc/sysconfig/network-scripts/ifcfg-eth0更新UUID值,虽然不改暂时也没发现有问题. 网上查找需要n ...

  6. tensorflow enqueue_many传入多个值的列表传入异常问题————Shape () must have rank at least 1

    tf 的队列操作enqueue_many传入的值是列表,但是放入[]列表抛异常 File "C:\Users\lihongjie\AppData\Local\Programs\Python\ ...

  7. iOS 静态库 与 demo 联合调试

    在修复bug或者开发静态库需要调试,这个时候需要把工程中的.framework和资源bundle文件都替换为静态库原工程文件 首先需要确保静态库工程文件没有打开,Xcode不允许在两个地方同时打开同一 ...

  8. bootstrap轮播图不能显示左右箭头

    引入font文件夹即可 原文 :http://www.imooc.com/qadetail/64277

  9. Sprint11

    进展:基本设置和显示已经完成,然后是可以通过长按事件弹出对话框可以进行停用.修改.取消该事件提醒的实现,通过触发动作跳转到各个部分页面.

  10. CentOS7服务器上搭建Gitlab

    Gitlab如何搭建? 安装gitlab所需要的依赖 sudo yum install curl policycoreutils openssh-server openssh-clients 使ssh ...