题目:pid=5318">http://acm.hdu.edu.cn/showproblem.php?pid=5318 题意:给定n个数字串和整数m,规定若数字串s1的后缀和数字串s2的前缀同样且长度≥2,则s2能够拼接在s1的后面,每一个串能够反复用,问拼接m个数字串有多少种方法. n<=50,m<=1e9 分析:定义dp[i][j]为拼接了i个串而且这个长串以s[j](输入的第j个数字串)结尾的方案数. 那么有 for(int i=1;i<=n;i++) dp[1][…
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 438    Accepted Submission(s): 150 Problem Description Chang'e (嫦娥) is…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5411 题意:按题目转化的意思是,给定N和M,再给出一些边(u,v)表示u和v是连通的,问走0,1,2.....M步的方案数. 分析:这题和 hdu5318 The Goddess Of The Moon差点儿相同,就是多了一个等比数列求和. 代码: #include <cstdio> #include <iostream> #include <cstring> using na…
传送门 矩阵快速幂优化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…
传送门 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…
传送门 一道不错的矩阵快速幂优化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)的. 于是可以用倍增的…
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的序列,序列中的数都是不超过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​表示不限制选出的数/选出的数不能是质…
传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. 于是倍增预处理出logloglog个矩阵每次变成O(n2)O(n^2)O(n2)转移. 代码…
传送门 不得不说神仙出题人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方程写出来,发现$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…
LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都是固定的方式 所以可以预处理转移矩阵用矩阵快速幂进行优化 但是如果在计算的时候暴力\(状态^3\)进行转移会TLE 但是注意到在这个时候有用的状态其实只有一个向量 所以就预处理倍增然后用向量乘矩阵来优化到单次\(logn状态^2\)就可以了 有点卡常 //Author: dream_maker #i…
题面 [错解] 哎\(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}$…
哇这题剧毒,卡了好久常数才过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…
建立矩阵,跑快速幂 /************************************************************** Problem: 4000 User: idy002 Language: C++ Result: Accepted Time:32 ms Memory:836 kb ****************************************************************/ #include <cstdio> #include…
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…
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的一…
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…
UVA 11551 - Experienced Endeavour 题目链接 题意:给定一列数,每一个数相应一个变换.变换为原先数列一些位置相加起来的和,问r次变换后的序列是多少 思路:矩阵高速幂,要加的位置值为1.其余位置为0构造出矩阵,进行高速幂就可以 代码: #include <cstdio> #include <cstring> const int N = 55; int t, n, r, a[N]; struct mat { int v[N][N]; mat() {mem…
UVA10518 - How Many Calls?(矩阵高速幂) 题目链接 题目大意:给你fibonacci数列怎么求的.然后问你求f(n) = f(n - 1) + f(n - 2)须要多少次调用,而且这个数非常大,取模一个进制的数. 解题思路:要发现F(n) = 2 *f(n) - 1这个规律.预计要非常熟系fibonacci数列,我明明推出了好多项后可是一点也没有发现规律. 然后要用矩阵高速幂来求fibonacci.由于n非常大. 构造这种矩阵 1, 1 (2*2矩阵) *  f(n -…
pid=2842">题目链接 题意:求出最少步骤解出九连环. 取出第k个的条件是,k-2个已被取出,k-1个仍在支架上. 思路:想必九连环都玩过吧,事实上最少步骤就是从最后一个环開始.向前一直取出来即可了. 所以如果取出前n个环所须要的步骤为f(n),那么在此之前f(n - 2)要被取出,再加上1.即第n个环被取出,所以仅仅剩下第n-1环没被取出,那么我们将前n-2环再套上去(套上去和取下来的步骤是一样.都为f(n - 2)),所以取出n-1环的步骤为f(n - 1),因此能够得到一个递推…
pid=2276">题目链接 题意:有n盏灯.编号从1到n.他们绕成一圈,也就是说.1号灯的左边是n号灯.假设在第t秒的时候,某盏灯左边的灯是亮着的,那么就在第t+1秒的时候改变这盏灯的状态.输入m和初始灯的状态.输出m秒后,全部灯的状态. 思路:事实上每盏灯的状态之和前一盏和自己有关.所以能够得到一个关系矩阵.如果有6盏灯,因此能够得到关系矩阵例如以下:  (1, 0, 0, 0, 0, 1)  (1, 1, 0, 0, 0, 0)  (0, 1, 1, 0, 0, 0)  (0, 0,…
题目连接:uva 10655 - Contemplation! Algebra 题目大意:输入非负整数,p.q,n,求an+bn的值,当中a和b满足a+b=p,ab=q,注意a和b不一定是实数. 解题思路:定义f(n)=an+bn,则有f(n)∗(a+b)=(an+bn)∗(a+b)=an+1+abn+ban+bn+1=f(n+1)+abf(n−1), 所以f(n+1)=(a+b)f(n)−abf(n−1),用矩阵高速幂求解. #include <cstdio> #include <cs…