珍珠项链(洛谷-P2768)(Dp矩阵加速)
文章目录
- 题目
- 思路
- 代码
题目
Luogu
题目大意:
kkk 种珍珠,每种珍珠都要用上,问能做出长度[1,2,…,N]的首饰的方案数,答案模123456789112345678911234567891
T<=10,1<=N<=1000000000,0<=K<=30T <=10, 1<= N<= 1000000000, 0<= K<= 30T<=10,1<=N<=1000000000,0<=K<=30
思路
我们定义:f[i][j]:前i个位置用j种珍珠的方案数f[i][j]:前i个位置用j种珍珠的方案数f[i][j]:前i个位置用j种珍珠的方案数
于是有转移方程式:
f[i][j]=f[i−1][j]∗j+f[i−1][j−1]∗(k−j)f[i][j]=f[i-1][j]*j+f[i-1][j-1]*(k-j)f[i][j]=f[i−1][j]∗j+f[i−1][j−1]∗(k−j)
其中f[0][0]=1f[0][0]=1f[0][0]=1
那么 Ans=∑i=1nf[i][k]Ans=\sum_{i=1}^{n}f[i][k]Ans=∑i=1nf[i][k]
发现这样每次 iii 只会+1,并且转移时系数和 iii 没太大关系,于是可以考虑矩阵加速
我们记 ansi=∑j=1if[j][k]ans_i=\sum_{j=1}^{i}f[j][k]ansi=∑j=1if[j][k]
那么可以得到转换矩阵:
(f[i−1][0]f[i−1][1]⋯f[i−1][k]ansi−2)∗(0k0⋯00001k−1⋯000002⋯000⋮⋮⋮⋱⋮⋮⋮000⋯k−110000⋯0k1000⋯001)=(f[i][0]f[i][1]⋯f[i][k]ansi−1)\left( \begin{matrix} f[i-1][0]&f[i-1][1]&\cdots&f[i-1][k]&ans_{i-2} \end{matrix} \right) * \left( \begin{matrix} 0&k&0&\cdots&0&0&0\\ 0&1&k-1&\cdots&0&0&0\\ 0&0&2&\cdots&0&0&0\\ \vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots\\ 0&0&0&\cdots&k-1&1&0\\ 0&0&0&\cdots&0&k&1\\ 0&0&0&\cdots&0&0&1\\ \end{matrix} \right) \quad= \left( \begin{matrix} f[i][0]&f[i][1]&\cdots&f[i][k]&ans_{i-1} \end{matrix} \right) (f[i−1][0]f[i−1][1]⋯f[i−1][k]ansi−2)∗⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛000⋮000k10⋮0000k−12⋮000⋯⋯⋯⋱⋯⋯⋯000⋮k−100000⋮1k0000⋮011⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞=(f[i][0]f[i][1]⋯f[i][k]ansi−1)
那么记转换矩阵为 AAA ,那么 An+1A^{n+1}An+1 的右上角即为答案
时间复杂度: O(k3logn)O(k^3log_n)O(k3logn)
代码
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<cstdio>
#include<queue>
#include<vector>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
LL read(){ LL f=1,x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f;
}
#define MAXN 32
#define INF 0x3f3f3f3f
#define Mod 1234567891
struct Matrix{int r,c;LL m[MAXN+5][MAXN+5];Matrix(){}Matrix(int R,int C){r=R,c=C,memset(m,0,sizeof(m));}Matrix operator * (Matrix a){Matrix b(r,a.c);for(int i=1;i<=r;i++)for(int j=1;j<=a.c;j++)for(int k=1;k<=c;k++)b.m[i][j]=(b.m[i][j]+m[i][k]*a.m[k][j]%Mod)%Mod;return b;}void print(){for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)printf("%lld",m[i][j]),putchar(j==c?'\n':' ');return ;}
};
Matrix Pow(Matrix x,int y){Matrix ret(x.r,x.c);for(int i=1;i<=x.r;i++)ret.m[i][i]=1;while(y){if(y&1) ret=ret*x;x=x*x;y>>=1;}return ret;
}
Matrix A,B;
int main(){int T=read();while(T--){int n=read(),k=read();A=B=Matrix();A.r=A.c=k+2;for(int i=2;i<=k+1;i++)A.m[i][i]=i-1,A.m[i-1][i]=k-i+2;A.m[k+1][k+2]=1,A.m[k+2][k+2]=1;A=Pow(A,n+1);//ans[-1]...ans[n]B.r=1,B.c=k+2;B.m[1][1]=1;B=B*A;printf("%lld\n",B.m[1][k+2]);}return 0;
}
珍珠项链(洛谷-P2768)(Dp矩阵加速)相关推荐
- 洛谷 1373 dp 小a和uim之大逃离 良心题解
洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...
- 洛谷P1129 [ZJOI2007] 矩阵游戏 题解
洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...
- 【bzoj3240 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法--然而我太弱了,一开始只想到了矩阵乘法的 ...
- 洛谷p1373 DP
传送门:洛谷p1373 这道题我原本的想法就是很简单的f[i][j][x][y][0/1];就是以第i,j格为终点的方案数目,可是即wa又mle ,最后看了看题解才比较了解.就是我们不去储存两个人瓶子 ...
- 洛谷 P2768 珍珠项链
题目背景 小L通过泥萌的帮助,成功解决了牛栏的修建问题.奶牛们觉得主人非常厉害,于是再也不敢偷懒,母牛们奋力挤奶,生娃.子子孙孙无穷匮也!小L于是成为了一代富豪! 但是一直困扰小L的就是单身问题!小L ...
- 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告
P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...
- 洛谷P1129: [ZJOI2007]矩阵游戏(二分图最大匹配)
https://www.luogu.org/problemnew/show/P1129 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N×N ...
- 洛谷 P2239 螺旋矩阵
题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...
- 【洛谷P3390】 矩阵快速幂(模板)
贴一下矩阵快速幂的模板 #include<iostream> #include<cstdio> #include<cstring> #include<stri ...
- 洛谷P7515:矩阵游戏(差分约束)
解析 如果没有元素均要在 [0,1e6][0,1e6][0,1e6] 的条件,可以很容易的构造出一个合法解. 那么我们就要通过调整得到的解,使所有数都在合法范围内. 注意到,每次给某一行/列依次+1, ...
最新文章
- java方法里执行两条sql_Java如何在数据库上执行多个SQL命令?
- 从采样到结果报告,未来的核酸检测要实现「无人化」
- https nginx phpstudy_window下phpstudy使用nginx配置https
- 【cntk速成】cntk图像分类从模型自定义到测试
- 【机器学习算法专题(蓄力计划)】十二、机器学习中KNN算法
- 7.4.7 2DPCA
- css3 下边框缓缓划过_一篇文章带你了解CSS3按钮知识
- ubuntu切换root用户
- centos7恢复mysql数据库_mysql数据库恢复过程记录
- vscode的eslint无效_vscode配置eslint自动保存功能不生效
- golang文件夹位置判断
- android底部导航栏网络请求有冲突,Android 自定义底部导航栏 CustomizeTabLayout(支持访问网络图片、本地图片)...
- django-pure-pagination 分页插件
- C#.NET学习笔记11,12---布尔表达式2组合,if语句
- oracle在cmd中启动数据库实例
- 印度孵化器的红利期才刚到,但花样还真不少
- 伪装文件病毒分析-流氓软件
- jQuery 实现小米手风琴图片案例
- 测试高薪必备:3步教测试人员破解子查询
- 一群不想鸡娃的直男程序员,决定对一支笔下手了