文章目录

  • 题目
  • 思路
  • 代码

题目

Luogu
题目大意:
kkk 种珍珠,每种珍珠都要用上,问能做出长度[1,2,…,N]的首饰的方案数,答案模123456789112345678911234567891
T&lt;=10,1&lt;=N&lt;=1000000000,0&lt;=K&lt;=30T &lt;=10, 1&lt;= N&lt;= 1000000000, 0&lt;= K&lt;= 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=1n​f[i][k]
发现这样每次 iii 只会+1,并且转移时系数和 iii 没太大关系,于是可以考虑矩阵加速
我们记 ansi=∑j=1if[j][k]ans_i=\sum_{j=1}^{i}f[j][k]ansi​=∑j=1i​f[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]&amp;f[i-1][1]&amp;\cdots&amp;f[i-1][k]&amp;ans_{i-2} \end{matrix} \right) * \left( \begin{matrix} 0&amp;k&amp;0&amp;\cdots&amp;0&amp;0&amp;0\\ 0&amp;1&amp;k-1&amp;\cdots&amp;0&amp;0&amp;0\\ 0&amp;0&amp;2&amp;\cdots&amp;0&amp;0&amp;0\\ \vdots&amp;\vdots&amp;\vdots&amp;\ddots&amp;\vdots&amp;\vdots&amp;\vdots\\ 0&amp;0&amp;0&amp;\cdots&amp;k-1&amp;1&amp;0\\ 0&amp;0&amp;0&amp;\cdots&amp;0&amp;k&amp;1\\ 0&amp;0&amp;0&amp;\cdots&amp;0&amp;0&amp;1\\ \end{matrix} \right) \quad= \left( \begin{matrix} f[i][0]&amp;f[i][1]&amp;\cdots&amp;f[i][k]&amp;ans_{i-1} \end{matrix} \right) (f[i−1][0]​f[i−1][1]​⋯​f[i−1][k]​ansi−2​​)∗⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛​000⋮000​k10⋮000​0k−12⋮000​⋯⋯⋯⋱⋯⋯⋯​000⋮k−100​000⋮1k0​000⋮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矩阵加速)相关推荐

  1. 洛谷 1373 dp 小a和uim之大逃离 良心题解

    洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...

  2. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  3. 【bzoj3240 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法--然而我太弱了,一开始只想到了矩阵乘法的 ...

  4. 洛谷p1373 DP

    传送门:洛谷p1373 这道题我原本的想法就是很简单的f[i][j][x][y][0/1];就是以第i,j格为终点的方案数目,可是即wa又mle ,最后看了看题解才比较了解.就是我们不去储存两个人瓶子 ...

  5. 洛谷 P2768 珍珠项链

    题目背景 小L通过泥萌的帮助,成功解决了牛栏的修建问题.奶牛们觉得主人非常厉害,于是再也不敢偷懒,母牛们奋力挤奶,生娃.子子孙孙无穷匮也!小L于是成为了一代富豪! 但是一直困扰小L的就是单身问题!小L ...

  6. 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

  7. 洛谷P1129: [ZJOI2007]矩阵游戏(二分图最大匹配)

    https://www.luogu.org/problemnew/show/P1129 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N×N ...

  8. 洛谷 P2239 螺旋矩阵

    题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...

  9. 【洛谷P3390】 矩阵快速幂(模板)

    贴一下矩阵快速幂的模板 #include<iostream> #include<cstdio> #include<cstring> #include<stri ...

  10. 洛谷P7515:矩阵游戏(差分约束)

    解析 如果没有元素均要在 [0,1e6][0,1e6][0,1e6] 的条件,可以很容易的构造出一个合法解. 那么我们就要通过调整得到的解,使所有数都在合法范围内. 注意到,每次给某一行/列依次+1, ...

最新文章

  1. java方法里执行两条sql_Java如何在数据库上执行多个SQL命令?
  2. 从采样到结果报告,未来的核酸检测要实现「无人化」
  3. https nginx phpstudy_window下phpstudy使用nginx配置https
  4. 【cntk速成】cntk图像分类从模型自定义到测试
  5. 【机器学习算法专题(蓄力计划)】十二、机器学习中KNN算法
  6. 7.4.7 2DPCA
  7. css3 下边框缓缓划过_一篇文章带你了解CSS3按钮知识
  8. ubuntu切换root用户
  9. centos7恢复mysql数据库_mysql数据库恢复过程记录
  10. vscode的eslint无效_vscode配置eslint自动保存功能不生效
  11. golang文件夹位置判断
  12. android底部导航栏网络请求有冲突,Android 自定义底部导航栏 CustomizeTabLayout(支持访问网络图片、本地图片)...
  13. django-pure-pagination 分页插件
  14. C#.NET学习笔记11,12---布尔表达式2组合,if语句
  15. oracle在cmd中启动数据库实例
  16. 印度孵化器的红利期才刚到,但花样还真不少
  17. 伪装文件病毒分析-流氓软件
  18. jQuery 实现小米手风琴图片案例
  19. 测试高薪必备:3步教测试人员破解子查询
  20. 一群不想鸡娃的直男程序员,决定对一支笔下手了

热门文章

  1. Establishing SSL
  2. phyton做九九乘法表
  3. 计算机体系结构期末重点,计算机系统结构期末重点题目及考点
  4. C#箴言:定义常量的两种方法
  5. 本周AI热点回顾:Hinton独立发布44页论文火爆社区;新特效火爆全网!各路神仙齐唱《蚂蚁呀嘿》...
  6. 七个技巧!Godaddy域名安全指数提高N倍
  7. android 锁屏代码分析,锁屏分析(Android9.0)
  8. MD5在线加密,带盐
  9. cmyk列印颜色_列印
  10. Koo叔说Shader—UV旋转