CF - 392 C. Yet Another Number Sequence

题目传送门

这个题看了十几分钟直接看题解了,然后恍然大悟,发现纸笔难于描述于是乎用Tex把初始矩阵以及转移矩阵都敲了出来

\(n\le 1e17\) 这个数量级求前缀和,发现递推关系之后矩阵快速幂是可以求出来的,所以就尝试把\(A_i(k)\) 的递推式求出来。

\[A_{i-1}(k) = F_{i-1} * (i-1) ^ k\\
A_{i-2}(k) = F_{i-2} * (i-2) ^ k
\]
\[\begin{aligned}
A_i(k) =& F_i * i ^ k\\
=&(F_{i-1} + F_{i-2}) * i ^ k\\
=& F_{i-1} * [(i-1) + 1] ^ k + F_{i-2} * [(i-2) + 2] ^ k;\\
=& \sum_{j=0}^k{C_k^j *F_{i-1} * (i-1) ^ j} + \sum_{j=0}^k{C_k^j * F_{i-2} * (i-2) ^ j * 2 ^ {k-j}}\\
=& \sum_{j=0}^{k}A_{i-1}(j)*C_k^j + \sum_{j=0}^kA_{i-2}(j)*C_k^j*2^{k-j}
\end{aligned}
\]

到这里递推式就求出来了

\[A_i(k) = \sum_{j=0}^kA_{i-1}(j) *C_k^j + \sum_{j=0}^kA_{i-2}(j)*C_k^j*2^{k-j}
\]

由于最后求得是\(\sum_{i=1}^n A_i(k)\)

所以要把它放到矩阵中,然后矩阵中其他的元素也就理所当然的可以摆出来了

\[\begin{bmatrix}
\sum_{j=1}^i A_j(k)&A_i(0)&A_i(1)&\cdots&A_i(k)&A_{i-1}(0)&A_{i-1}(1)&\cdots A_{i-1}(k)
\end{bmatrix}
\]

然后根据递推式以及原始矩阵设计转移矩阵

\[\begin{bmatrix}1&0&0&\cdots&0&0&0&\cdots&0\\C_k^0&C_0^0&C_1^0&\cdots&C_k^0&1&0&\cdots&0\\C_k^1&0&C_1^1&\cdots&C_k^1&0&1&\cdots&0\\\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\ddots&\vdots\\C_k^k&0&0&\cdots&C_k^k&0&0&\cdots&1\\C_k^0*2^k&C_0^0*2^0&C_1^0*2^1&\cdots&C_k^0*2^k&0&0&\cdots&0\\C_k^1*2^{k-1}&0&C_1^1*2^0&\cdots&C_k^1*2^{k-1}&0&0&\cdots&0\\\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\ddots&\vdots\\C_k^k*2^0&0&0&\cdots&C_k^k*2^{0}&0&0&\cdots&0\end{bmatrix}
\]

可能直接放出来不好理解,那么对这个矩阵划分一下几个区

左边一列是用来求和的,中间这两部分是用来计算\(A_{i+1}^j (j\in[0,k])\) 的,右侧是用来转移\(A_{i}^j(j\in [0,k])\) 的。

最后直接矩阵快速幂就好了,整个过程细节比较多。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 101;
const int mod = 1e9 + 7;
struct matrix{
ll mat[N][N];
int r,c;
matrix(){}
matrix(int rr,int cc){r = rr,c= cc;}
void clear(){
memset(mat,0,sizeof mat);
}
};
void MOD(ll &x){x=(x%mod+mod)%mod;}
matrix operator * (const matrix&a,const matrix&b){
matrix c(a.r,b.c);
c.clear();
for(int k=0;k<a.c;k++){
for(int i=0;i<c.r;i++){
for(int j=0;j<c.c;j++){
MOD(c.mat[i][j] += a.mat[i][k] * b.mat[k][j] % mod);
}
}
}
return c;
}
ll C[55][55],p[55];
void prework(){
p[0] = 1;
for(int i=1;i<=50;i++)p[i] = p[i-1] * 2 % mod;
for(int i=0;i<=50;i++)C[i][0] = 1;
for(int i=1;i<=50;i++){
for(int j=1;j<=i;j++)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % mod;
}
}
ll solve(ll n,ll k){
if(n == 1)return 1;
if(n == 2)return (p[k+1] + 1) % mod;
ll sum = 0;
int kk = k * 2 + 3;
matrix x(1,kk),y(kk,kk);
x.mat[0][0] = (p[k+1] + 1) % mod;
for(int i=0;i<=k;i++){
x.mat[0][i+1] = p[i+1];
x.mat[0][i+k+2] = 1;
}
y.mat[0][0] = 1;
for(int i=0;i<=k;i++){
y.mat[i+1][0] = C[k][i];
y.mat[i+k+2][0] = C[k][i] * p[k-i] % mod;
y.mat[i+1][i+k+2] = 1;
}
for(int i=0;i<=k;i++){
for(int j=0;j<=i;j++){
y.mat[j+1][i+1] = C[i][j];
y.mat[j+k+2][i+1] = C[i][j] * p[i-j] % mod;
}
}
n -= 2;
for(;n;n >>= 1){
if(n & 1)x = x * y;
y = y * y;
}
return x.mat[0][0];
}
int main(){
ll n,k;
prework();
scanf("%lld%lld",&n,&k);
printf("%lld\n",solve(n,k));
return 0;
}

CF - 392 C. Yet Another Number Sequence (矩阵快速幂)的更多相关文章

  1. UVA - 10689 Yet another Number Sequence 矩阵快速幂

                      Yet another Number Sequence Let’s define another number sequence, given by the foll ...

  2. Yet Another Number Sequence——[矩阵快速幂]

    Description Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...

  3. HDU 1005 Number Sequence(矩阵快速幂,快速幂模板)

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  4. HDU - 1005 Number Sequence 矩阵快速幂

    HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...

  5. HDU - 1005 -Number Sequence(矩阵快速幂系数变式)

    A number sequence is defined as follows:  f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ...

  6. SDUT1607:Number Sequence(矩阵快速幂)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number seq ...

  7. Yet another Number Sequence 矩阵快速幂

    Let’s define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n ...

  8. Codeforces 392C Yet Another Number Sequence (矩阵快速幂+二项式展开)

    题意:已知斐波那契数列fib(i) , 给你n 和 k , 求∑fib(i)*ik (1<=i<=n) 思路:不得不说,这道题很有意思,首先我们根据以往得出的一个经验,当我们遇到 X^k ...

  9. CodeForces 392C Yet Another Number Sequence 矩阵快速幂

    题意: \(F_n\)为斐波那契数列,\(F_1=1,F_2=2\). 给定一个\(k\),定义数列\(A_i=F_i \cdot i^k\). 求\(A_1+A_2+ \cdots + A_n\). ...

  10. LightOJ 1065 - Number Sequence 矩阵快速幂水题

    http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...

随机推荐

  1. Lesson_strange_words6

    stylized 有艺术效果的 slide 幻灯片,滑动 template 模板,样板 grasp 掌握,领悟 factor 因素 twisted pair cable 双绞线 twisted 扭曲的 ...

  2. 阿里面试官:什么是MySQL索引,为什么要有索引?

    一.什么是索引? 索引就好比字典的目录一样 我们通常都会先去目录查找关键偏旁或者字母再去查找 要比直接翻查字典查询要快很多 二.为什么要有索引? 然而我们在使用mysql数据库的时候也像字典一样有索引 ...

  3. 虚拟机linux共享文件夹

    linux共享文件夹问题 1. 初配置 2. 挂载 018.7.8 为了实现win7与VMware中linux文件夹共享很花费了一些时间,但终成正果 1. 初配置 虚拟机设置->选项->共 ...

  4. innodb日志文件大小

    innodb是用多个文件作为一组循环日志,通常不需要修改默认的日志数量,只修改每个日志文件的大小即可,要修改日志文件大小,需要完全关闭mysql,将旧的日志文件移到其他地方保存,重新配置参数,然后重启 ...

  5. 【Oracle】DRM官方介绍

    DRM 简介 By:  Allen Gao 首先,我们对和DRM 相关的一些概念进行介绍. Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer ...

  6. Tippy.js - 免费开源且高度可定制的气泡提示独立组件

    推荐一个非常优秀的 web 气泡提示独立UI组件. 介绍 Tippy.js 是一款用于Web的完整工具提示,弹出菜单,下拉菜单和菜单解决方案.适用于鼠标,键盘和触摸输入. 特点 超轻量的纯 javas ...

  7. 攻防世界—pwn—cgpwn2

    题目分析 题目提示 checksec检查文件保护机制 使用ida查看伪代码 hello函数存在溢出,与level2类似 信息收集 system地址 name的地址 编写脚本 from pwn impo ...

  8. 阿里云OSS对象存储服务(二)

    一.使用SDK 在OSS的概览页右下角找到"Bucket管理",点击"OSS学习路径" 点击"Java SDK"进入SDK开发文档 二.创建 ...

  9. ATtiny3217 x WS2812B梦幻联动

    TinyAVR 1-series是Microchip于2018年推出的AVR单片机系列,定位是新一代的8位单片机,ATtiny3217是其中最高端的一款.相比于ATmega328P那个时代的AVR,A ...

  10. 前端面试之JavaScript的基本数据类型!

    前端面试之JavaScript的基本数据类型! JS的基本数据类型 数字 字符串 布尔值 JavaScript中有两个特殊的原始值: null (空) 和undefined (未定义), , 它们不是 ...