传送门 不得不说神仙出题人DZYODZYODZYO出的题是真的妙. f[i][j][k]f[i][j][k]f[i][j][k]表示选的硬币最大面值为iii最小面值不小于jjj,总面值为kkk时的选法总数. 然后有f[i][l][k1+k2]=∑f[i][j][k1]∗f[j][l][k2]f[i][l][k1+k2]=\sum f[i][j][k1]*f[j][l][k2]f[i][l][k1+k2]=∑f[i][j][k1]∗f[j][l][k2] 这不就是矩阵乘法吗? 上快速幂优化就行了.…
传送门 矩阵快速幂优化dp简单题. 考虑状态转移方程: f[time][u]=∑f[time−1][v]f[time][u]=\sum f[time-1][v]f[time][u]=∑f[time−1][v] 把一个点拆成9个来转换边长,然后根据题意模拟连边就行了. 最后用矩阵快速幂优化一下转移就能过啦. 代码: #include<bits/stdc++.h> using namespace std; int n,t,m; char s[50]; const int mod=2009; str…
传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. 于是倍增预处理出logloglog个矩阵每次变成O(n2)O(n^2)O(n2)转移. 代码…
传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9,m≤2e7,p≤100)(n\le1e9,m\le2e7,p\le100)(n≤1e9,m≤2e7,p≤100). 思路: 首先因为只需要是ppp的倍数,因此可以看成全局和对ppp取模为000方案数. 设状态f0/1,i,jf_{0/1,i,j}f0/1,i,j​表示不限制选出的数/选出的数不能是质…
传送门 考虑直接推式子不用优化怎么做. 显然每一个二进制位分开计算贡献就行. 即记录fi,jf_{i,j}fi,j​表示距离iii这个点不超过jjj的点的每个二进制位的0/10/10/1个数. 但直接存是会爆炸的. 考虑到每个数只会被用一次,所以可以考虑主席树那种复用信息的思想来继承长链后代的信息,然后短链直接暴力统计贡献就行. 由于ldxldxldx蒟蒻是口胡选手只会暴力写法,因此正解差不多是照着标程写的233. 细节较多,用指针维护比较自然一些. 代码…
传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个三滴血的. 显然是可以从f[i−1]f[i-1]f[i−1]转移过来的. 但是仔细一想,这个递推关系在i=1i=1i=1~nnn的时候都是一样的,于是把后面三个状压上矩阵快速幂优化就行了. 直接转是O(T∗size3log)O(T*size^3log)O(T∗size3log)的. 于是可以用倍增的…
传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的. 考虑到每次都是一样的就可以用矩阵快速幂优化一波. 代码: #include<bits/stdc++.h> using namespace std; int n,m,mod,fail[21]; bool vis[21][10]; char s[21]; struct Matrix{ int va…
Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. 在这种限制下其实只有 N−1N − 1N−1 个位置可以切. 对于一种切的方案,假如切完后每块的宽度分别是:w1,w2,w3,...,wk(∑wi=N)w_1, w_2, w_3, ..., w_k(\sum w_i = N)w1​,w2​,w3​,...,wk​(∑wi​=N),那么该种方案对应…
[输入] 一行两个整数 n P [输出] 从小到大输出可能的 k,若不存在,输出 None [样例输入 1] 5 5 [样例输出] 2 [样例解释] f[0] = 2 f[1] = 2 f[2] = 4 f[3] = 6 mod 5 = 1 f[4] = 5 mod 5 = 0 f[5] = 1 30%的数据保证 n, P ≤ 1000 100%的数据保证 n, P ≤ 10^9 一道算是比较综合的数论题吧,感觉不是很难. 先用矩阵快速幂求出k=1时f[n]的值. 然后解一个k*f[n]+x*p…
LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都是固定的方式 所以可以预处理转移矩阵用矩阵快速幂进行优化 但是如果在计算的时候暴力\(状态^3\)进行转移会TLE 但是注意到在这个时候有用的状态其实只有一个向量 所以就预处理倍增然后用向量乘矩阵来优化到单次\(logn状态^2\)就可以了 有点卡常 //Author: dream_maker #i…
实际上是水水题叻,先把朴素DP方程写出来,发现$dp[i]$实际上是$dp[i-k]-dp[i-1]$的和,而看数据范围,我们实际上是要快速地求得这段的和,突然就意识到是矩阵快速幂叻. 构建矩阵什么的还是很简单滴,主要就是练一练手. (还有就是水一水blog!换个字体,换个心情! (快速乘是在模数很大时要用,避免超long long #include<bits/stdc++.h> using namespace std; #define LL long long #define mod 777…
题面 [错解] 哎\(N \leq 50\)?双向搜索? 切了切-- 等下,好像要求方案数-- 好像搜不了 哎他给\(V_{i} | V_{i+1}\)干嘛? 肯定有用啊 为了体现条件的用处,我在搜下一步时把后面的和S除以当前值 但还是T了啊 写了个\(O(NW^{2})\)的完全背包水水,瞎搞了个神奇算法,揉在一起,成功爆零 [正解] 设\(f_{t,i,j}\)表示选的硬币编号最大为i,最小大于等于j的凑出t的方案数 这样可以完整地表示出\(f_{t,i,j}=\sum f_{t_{1},i…
CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 558    Accepted Submission(s): 227 Problem Description CRB is now playing Jigsaw Puzzle.There are N kinds of pieces with infinite s…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首先要设计一个不太好想的状态:f[i][j]表示大串上到第 i 位时有小串前 j 位的后缀,且不包含整个小串的方案数: 也就是如果小串是 12312 , f[5][3] 表示目前大串的情况是 **123... : 这个状态要从 i 转移到 i+1 ,还需要一个帮助它的数组 a,a[i][j]表示在长度…
题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s的前j个字符一致的情况下)的方法数 若匹配到s串长度为i的后缀加一个字符num可以组成最长长度为j的后缀,设a[i][j]为num的方法数 例如,s为12312,a为 9 1 0 0 0 08 1 1 0 0 08 1 0 1 0 09 0 0 0 1 08 1 0 0 0 1 (i,j都是从0到m-1) 如…
题目链接 题目大意:求$(\sum\limits_{i=0}^n C_{nk}^{ik+r})\ mod \ p$的值. --------------------- 讲真,一开始看到这个题我都没往DP方面想,以为是什么大力推式子的数学题. 设$f_{i,j}$表示考虑前$i$个物品,选出的物品$mod \ k=j$的方案数.最后输出$f_{n,r}$. 易得转移方程: $f_{i,j}=f_{i-1,j}+f_{i-1,j-1}$ $f_{i,0}=f_{i-1,0}+f_{i-1,k-1}$…
建立矩阵,跑快速幂 /************************************************************** Problem: 4000 User: idy002 Language: C++ Result: Accepted Time:32 ms Memory:836 kb ****************************************************************/ #include <cstdio> #include…
传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果就是lcalcalca直接特判) 然后考虑最后把(u′,v′)(u',v')(u′,v′)连起来需要走一次还是两次. 这个就是一个二维数点问题了. 用dfsdfsdfs序求出每个点管辖的子树表示的区间. 然后对于询问(a,b)(a,b)(a,b)在dfs到aaa时统计bbb子树的答案. 把aaa子树…
传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码…
https://www.hackerrank.com/contests/hourrank-21/challenges/sams-numbers 设dp[s][i]表示产生的总和是s的时候,结尾符是i的所有合法方案数. 那么dp[s][i]可以由dp[s - i][1---m]中,abs(i - k) <= d的递推过来. 但是s很大,不能这样解决. 考虑到m只有10,而且dp[s][1]只能由dp[s - 1][1...m]递推过来. 那么先预处理dp[1--m][1--m] 写成m * m的一…
哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \frac{1}{sum+1}*(f(i+1,s')+[s==s'])$ 状态数只有$C_{8+3}^3=165$个,所以就可以矩乘优化了.再加上一个用于转移的$1$,矩阵大小是$166*166$的,因为多组询问,所以可以先把$2$的所有次幂的矩阵都预处理出来. 然后会发现复杂度是$O(T*166^3…
D. GukiZ and Binary Operations time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output We all know that GukiZ often plays with arrays. Now he is thinking about this problem: how many arrays a, of l…
E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Okabe likes to take walks but knows that spies from the Organization could be anywhere; that's why he wants to k…
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希望,这n个数中,至少有一个数是质数. Alice想知道,有多少个序列满足她的要求. Input 一行三个数,n,m,p. 1<=n<=10^9,1<=m<=2×10^7,1<=p<=100 Output 一行一个数,满足Alice的要求的序列数量,答案对20170408取模…
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优化dp. 我们设$ f[i][j] $表示前$ i $位匹配不吉利数字$ j $位时的方案数,因为每一位的转移方式都是相同的,于是用kmp预处理出转移矩阵,直接矩乘快速幂就能过了. #include<cstdio> #include<cmath> #include<cstdlib…
题意 有 n 个位置排成一行,可以放 m 种妹子.每个位置可以放也可以不放,规定某些妹子不能相邻,求方案数. 分析 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll qmul(ll x,ll y,ll p){ //快速乘 x%=p; y%=p; ll ans=; while(y){ ){ ans+=x; if(ans>=p) ans-=p; //这样写不能有负数 } x<<=; if(x…
搞懂了什么是矩阵快速幂优化.... 这道题的重点不是DP. /* 题意: 小明要走某条路,按照个人兴致,向前走一步的概率是p,向前跳两步的概率是1-p,但是地上有地雷,给了地雷的x坐标,(一维),求小明安全到达最后的概率. 思路: 把路分成好多段,小明安全走完每一段的概率乘起来就是答案. dp[i]=p*dp[i-1]+(1-p)*dp[i-2]; 参考fib数列构造矩阵进行快速幂. 注意初始化的时候,起点概率看作1,起点减一也就是有地雷的地方概率看作0.//屌丝一开始在这里没搞明白. */ #…
BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个值为非负数) Input 第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素. 对于100%的数据,有 n<=105,k<=109,|ai|<=10^5 Output 输出一个整数,表示和的最大值.答案对10000007取模. Sample Input…
BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻的0).例如,000,001 ,101,都是交错序列,而110则不是.对于一个长度为n的交错序列,统计其中0和1出现的次数,分别记为x和y. 给定参数a.b,定义一个交错序列的特征值为x^ay^b.注意这里规定任何整数的0次幂都等于1(包括0^0=1). 显然长度为n的交错序列可能有多个.我们想要知道,所有长…
原文链接www.cnblogs.com/zhouzhendong/p/Cayley-Hamilton.html Cayley-Hamilton定理与矩阵快速幂优化.常系数线性递推优化 引入 在开始本文之前,我们先用一个例题作为引入. 给定一个 \(n \times n\) 的矩阵 \(M\) , 求 \(M ^ k\) . \(n\leq 50, k\leq 10 ^ {50000}\) . 注意到 \(n\) 十分小,但是 $ \log k$ 非常大.如果使用传统的矩阵快速幂,时间复杂度为 \…