CF - 392 C. Yet Another Number Sequence (矩阵快速幂)
CF - 392 C. Yet Another Number Sequence
这个题看了十几分钟直接看题解了,然后恍然大悟,发现纸笔难于描述于是乎用Tex把初始矩阵以及转移矩阵都敲了出来
\(n\le 1e17\) 这个数量级求前缀和,发现递推关系之后矩阵快速幂是可以求出来的,所以就尝试把\(A_i(k)\) 的递推式求出来。
A_{i-2}(k) = F_{i-2} * (i-2) ^ k
\]
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}
\]
到这里递推式就求出来了
\]
由于最后求得是\(\sum_{i=1}^n A_i(k)\)
所以要把它放到矩阵中,然后矩阵中其他的元素也就理所当然的可以摆出来了
\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}
\]
然后根据递推式以及原始矩阵设计转移矩阵
\]
可能直接放出来不好理解,那么对这个矩阵划分一下几个区
左边一列是用来求和的,中间这两部分是用来计算\(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 (矩阵快速幂)的更多相关文章
- UVA - 10689 Yet another Number Sequence 矩阵快速幂
Yet another Number Sequence Let’s define another number sequence, given by the foll ...
- Yet Another Number Sequence——[矩阵快速幂]
Description Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...
- 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 ...
- HDU - 1005 Number Sequence 矩阵快速幂
HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...
- 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 ...
- SDUT1607:Number Sequence(矩阵快速幂)
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number seq ...
- 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 ...
- Codeforces 392C Yet Another Number Sequence (矩阵快速幂+二项式展开)
题意:已知斐波那契数列fib(i) , 给你n 和 k , 求∑fib(i)*ik (1<=i<=n) 思路:不得不说,这道题很有意思,首先我们根据以往得出的一个经验,当我们遇到 X^k ...
- 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\). ...
- LightOJ 1065 - Number Sequence 矩阵快速幂水题
http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...
随机推荐
- 【函数分享】每日PHP函数分享(2021-1-8)
explode() 使用一个字符串分割另一个字符串. array explode( string $delimiter , string $string [, int $limit ]) 参数描述de ...
- Laya 小游戏通用框架设计理念
当前在用laya做小游戏开发,做了几个项目,总结了一下游戏中所需要的一些模块,大概理了一下,然后写成一套自己习惯使用的框架 总结了一下其中的模块 大概要分为一下模块 1.Base 模块 存放一些 ...
- LeetCode117 每个节点的右向指针 II
给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...
- LeetCode700 二叉搜索树中搜索
给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 例如, 给定二叉搜索树: 4 / \ 2 7 / ...
- 容器编排系统K8s之Prometheus监控系统+Grafana部署
前文我们聊到了k8s的apiservice资源结合自定义apiserver扩展原生apiserver功能的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/ ...
- 入门训练 - 蓝桥杯(Python实现)
A+B问题: 题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入A.B,输出A+B. 输入格式 输入的第一行包括两个整数,由空格分隔,分别表示A.B. 输出格式 输出一行, ...
- CodeMonkey少儿编程第3章 times循环
目标 了解程序由哪三种基本的结构组成 了解循环的概念 掌握times的结构与用法 三种基本结构 计算机程序由三种最基本的结构组成,它们分别是: 顺序结构 循环结构 选择结构 千万不要被这些陌生的术语给 ...
- 【Android】报错 Please ensure Hyper-V is disabled in Windows Features, or refer to the Intel HAXM 的解决方案
参考文章 实测华为锐龙本(adm yes)安装Android avd虚拟机教程 环境 Android Studio 3.6; Windows 1909; AMD Ryzen 4800U with Ra ...
- js千分位分隔,数字货币化方法学习记录
js千分位分隔,数字货币化-4种方法(含正则) 方法1-整数货币化 // 整数货币化 function intCurrency(num) { var reg = new RegExp("^[ ...
- 2、fork函数与进程ID
1. fork函数 fork函数用于克隆一份当前的进程资源,调用fork函数之后,进程一分为二,并且两个进程的资源是一样的(只是资源内容完全一样,并不是同一份资源).fork函数的函数原型为:pid_ ...