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. 用python+sklearn(机器学习)实现天气预报数据 模型和使用

    用python+sklearn机器学习实现天气预报 模型和使用 项目地址 系列教程 0.前言 1.建立模型 a.准备 引入所需要的头文件 选择模型 选择评估方法 获取数据集 b.建立模型 c.获取模型 ...

  2. JAVA开发手册-Markdown

    前言 前 言 <Java 开发手册>是技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善.现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点 ...

  3. 树莓派-4WD智能小车操作小结

    树莓派-4WD智能小车操作小结 树莓派4B-4WD智能小车,双层结构,第一层结构为:小车扩展板(底层)+树莓派主板,通过铜柱隔离固定,小车扩展板相当于计算机的外设扩展板:上面一层为第二层,是三个舵机承 ...

  4. .NET斗鱼直播弹幕客户端(2021)

    .NET斗鱼直播弹幕客户端(2021) 离之前更新的两篇<.NET斗鱼直播弹幕客户端>已经有一段时间,近期有许多客户向我反馈刚好有这方面的需求,但之前的代码不能用了--但网上许多流传的No ...

  5. CAN总线采样点测试

    采样点是什么? 采样点是接受节点判断信号逻辑的位置,CAN通讯属于异步通讯.需要通过不断的重新同步才能保证收发节点的采样准确. 若采样点太靠前,则因为线缆原因,DUT外发报文尚未稳定,容易发生采样错误 ...

  6. 超详细 安装VMware Workstation,并安装WIN10操作系统连接外网 步骤指导

    首先下载VMware Workstation15.1版本,我保存在迅雷链接里面,下载速度非常可观. 链接:https://pan.xunlei.com/s/VMRSt6hHMZXEmPZCm6gJcG ...

  7. 本地jar添加到本地仓库 本地jar依赖无效问题

    最近工作发生了一个很奇怪的事情,我在本地写了一个项目,打包成jar,然后敲命令mvn install:install-file -DgroupId=com.yzwine -DartifactId=yz ...

  8. Python Pandas操作Excel

    Python Pandas操作Excel 前情提要 ☟ 本章使用的 Python3.6 Pandas==0.25.3 项目中需要用到excel的文件字段太多 考虑到后续字段命名的变动以及中文/英文/日 ...

  9. 从软件(Java/hotspot/Linux)到硬件(硬件架构)分析互斥操作的本质

    先上结论: 一切互斥操作的依赖是 自旋锁(spin_lock),互斥量(semaphore)等其他需要队列的实现均需要自选锁保证临界区互斥访问. 而自旋锁需要xcmpchg等类似的可提供CAS操作的硬 ...

  10. YARN运行流程