题意极其有毒,注意给的行列都是从0开始的. 状压DP,f[i][S]表示第i行状态为S的方案数,枚举上一行的状态转移.$O(n2^{2m})$ 使用矩阵加速,先构造矩阵a[S1][S2]表示上一行为S1是下一行是否能为S2,快速幂加速后得解.$O(2^{3m}m^2+2^{3m}\log n)$ #include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) for (int i=(l)…
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) --------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace std;   #define b(x) (1 &l…
Description ​ 有一个\(~n~\)行\(~m~\)列的棋盘,棋盘上可以放很多棋子,每个棋子的攻击范围有\(~3~\)行\(~p~\)列.用一个\(~3 \times p~\)的矩阵给出了棋子攻击范围的模板,棋子被默认在模板中的第一行,第\(~k~\)列,模板中棋子能攻击到的位置标记为\(~1\),不能攻击到的位置是\(~0\) .输入数据保证模板中的第二行第\(~k~\)列是\(~1\).在要求棋子互相不能攻击到的前提下,求摆放棋子的方案数. \(~1 \leq p \leq m,…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: 108  Time Limit: 10000/5000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others) 问题描述 小明很喜欢国际象棋,尤其喜欢国际象棋里面的大象(只要无阻挡能够斜着走任意格),但是他觉得国际象棋里的大象太凶残了…
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n.给定n,k,p,求满足要求的方案数%30031.n<=10^9,k<=p<=10. [算法]状压DP+矩阵快速幂 [题解]开始没看到p<=10,其实很显然p>k的话第一车就不满足要求了.考虑相邻停靠点没有关键信息,只能状压. 因为车都是从头开到尾的,所以直接考虑i~i-p+1的…
显然每一行棋子的某种放法是否合法只与上一行有关,状压起来即可.然后n稍微有点大,矩阵快速幂即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { ,f=;char c=getchar(); ;c=get…
题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修改,每次修改一个格子的概率.要求输出初始时和每次修改后的概率. \(n\leq 200000,m\leq 3,d\leq 10,q\leq 1000\) 题解 很容易想到状压DP:前\(i\)行在第\(i\)行的状态为\(j\)时连通块个数模\(d=k\)的概率. 当\(m=3\)时每行状态有\(9…
传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后用快速幂转移. 代码: #include<bits/stdc++.h> #define mod 1000000007 #define N 128 #define ll long long using namespace std; int T,up,n,m; struct Matrix{ ll va…
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #define MAXN 140 #define MOD 30031 using namespace std; struct Matrix { int num[MAXN]…
由于方块最多涉及3行,于是考虑将每两行状压起来,dfs搜索每种状态之间的转移. 这样一共有2^12种状态,显然进行矩阵快速幂优化时会超时,便考虑减少状态. 进行两遍bfs,分别为初始状态可以到达的状态,和可以到达终止状态的状态. 同时出现在两次bfs中的状态即为有效状态,一共有141种. 这样就可以跑出来了. 未加矩阵快速幂 50分 ..,..] of longint= ((-,,),(-,,),(,,),(,,),(-,,),(-,,),(,,),(-,,)); dy:..,..] of lo…
由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆公交车塞到前方第一个未到达的站台.这个时候公交车之间是没有区别的,因为只要保证每相邻p个站台每辆车都出现也即有k辆车就可以了. 于是设f[i][j]为i-p+1~i的车站停靠状况为j的方案数.并且表示i站台状况的这一位必为1,j中一共有k个1.于是状态数至多有C(9,4)=126种.转移比较显然,只…
题意:有一个m 行n 列的矩形方格棋盘,1 < = m< = 5,1=< n< =10^9,用1*2 的骨牌(可横放或竖放)完全覆盖,骨牌不能重叠,有多少种不同的覆盖的方法.你只需要求出覆盖方法总数 mod p 的值即可. 看到1e9立马知道快速幂DP或者数学方法,然后m<=5就状压吧 定义f[s][t]表示从s到t有多少种方案转移:则有f[s][t] = sigma(f[s][i] * f[i][t]) 所以可以用矩阵转移 最终答案就是f[(1<<m)-1][(…
题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计线路: 1.设共K辆公交车,则1到K号站作为始发站,N-K+1到N号台作为终点站. 2.每个车站必须被一辆且仅一辆公交车经过(始发站和终点站也算被经过).  3.公交车只能从编号较小的站台驶往编号较大的站台.  4.一辆公交车经过的相邻两个 站台间距离不得超过Pkm. 在最终设计线路之前,小Z想知道…
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,…, k". Let function(n, k) be the number of elegant s…
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法]AC自动机+DP+矩阵快速幂 [题解]其实题意的数据范围不太清晰,反正开200个点就足够了. 因为要匹配禁忌串,所以对禁忌串集合建立AC自动机,标记禁忌串结尾节点,以及下传到所有能fail到的点(这些点访问到都相当于匹配了禁忌串). 令f[i][j]表示匹配到节点i,长度为j的串的数量,先预处理a[i][j…
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的交错序列可能有多个.我们想要知道,所有长…
题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分析: dp+矩阵快速幂. 假如现在的数是m,模x余数是n,那么再从下一个block中选一个数a,a模x余数为b,那么新的数的余数就为(m∗10+a)%x,也就是(n∗10+b)%x,所以实际上我们只需要直接对余数进行操作.容易得到状态转移方程,其中dp[i][j]表示从第i个block中选择一个数后…
题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y-1)或者(x+1,y)或者(x+1,y+1)三个位子之一. 现在一共有N段线段,每条线段都是平行于X轴的.我们如果此时x是在这段线段之内的话,我们此时走到的点(x,y)需要满足0<=y<=Ci. 现在保证一段线段的终点,一定是下一段线段的起点.问我们从起点走到终点的行走方案数. 题解:简单的dp+…
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2-Am有M位,不出现是指X1X2-Xn中没有恰好一段等于A1A2-Am. A1和X1可以为0 \(0 \leq X_i \leq 9,0\leq Ai\leq 9,m \leq 20,n \leq 10^9\) 分析 先考虑暴力的思路,设\(dp[i][j]\)表示前i位数与不吉利数字匹配了前…
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1626.html 题目传送门 - 51Nod1626 题意 题解 首先考虑形象的想象本题中的思维空间.我们把整个 2*2*3*n 的四维空间看作 n 个 2*2*3 的三维空间顺次排列.考虑到 1*1*1*2 的方块,我们如果把边长 2 放在第 4 维上,相当于是填充了连续两个三维空间的对应位置.否则,边长 1 就放在了第 4 维上,相当于在一个三维空间中填充 1*1*2 的方块. 然后我们考虑状压…
宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做一系列的宣传.为了统一规划,CBA 镇长要求每个宣传栏只能占相邻的两个方格 位置.但这条道路被另一条道路分割成左右两段.CBA 镇长想知道,若每个位置都贴上宣传栏, 左右两段各有有多少种不同的张贴方案. 例如: N=6,M=3, K=2, 左,右边各有 5 种不同的张贴方案 输入 第一行: T 表示…
公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计线路: 1.设共K辆公交车,则1到K号站作为始发站,N-K+1到N号台作为终点站. 2.每个车站必须被一辆且仅一辆公交车经过(始发站和终点站也算被经过). 3.公交车只能从编号较小的站台驶往编号较大的站台. 4.一辆公交车经过的相邻两个 站台间距离不得超过Pkm. 在最终设计…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp$式子,设$dp[i][j]$为最慢的公交车走到了第$i$站,$[i,i+p-1]$站的状态为$j$时的方案数.$i$到$i+p-1$的范围内有且仅有$k$辆车,则状态$j$应该为$p$长度的二进制串,其中有且仅有$k$个$1$(表示$k$辆车)并且第$1$位一定为$1$(第$1$位对应了当前的位置…
题意:有一个n*m的棋盘(n,m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻(每个棋子最多和周围4个棋子相邻).求合法的方案总数. 思路:对于每一行,如果把没有棋子的地方记为0,有棋子的地方记为1,那么每一行的状态都可以表示成一个2进制数,进而将其转化成10进制.   那么这个问题的状态转移方程就变成了:   设dp[i][j][k]表示当前到达第i行,一共使用了j个棋子,且当前行的状态在压缩之后的十进制数为k时的状态总数.那么我们也可以类似的写出状态转移方程:…
UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1s1 大概是这题用到的几个套路我都见过罢 首先注意到 \(k\) 很小,故考虑状压 \(dp\),\(dp_{i,s}\) 表示当前所有 pollywog 都在编号 \([i-k+1,i]\) 范围内的石头上,并且有且仅有编号 \(i-x+1,x\in s\) 的石头上有 pollywog. 转移还是比较显…
题面: 传送门 思路: 把P形花圃记录为0,C形记录为1,那么一段花圃就可以状态压缩成一个整数 那么,我们可以有这样的状压dp: dp[i][S]表示前i个花圃,最后m个的状态为S的情况 如果这是一条链的花圃,那么直接状压转移就可以了,但是这道题是一个环 一个环上,前m-1个花圃会影响到后m-1个花圃的状态 因此我们考虑把这个环后面再“长出”m个花圃来,消除这种影响 具体做法是: 枚举所有合法的状态S,令dp[1][S]=1,其余为零,代表前m个的状态确定了然后递推 最后把dp[n+1][S]加…
Clarke and digits 问题描述 克拉克是一名人格分裂患者.某一天,克拉克变成了一个研究人员,在研究数字. 他想知道在所有长度在[l,r]之间的能被7整除且相邻数位之和不为k的正整数有多少个. 输入描述 第一行一个整数T(1≤T≤5),表示数据的组数. 每组数据只有一行三个整数l,r,k(1≤l≤r≤109,0≤k≤18) 输出描述 每组数据输出一行一个数,表示答案.由于答案太大,你只需对10^9+7取模即可. 输入样例 2 1 2 5 2 3 5 输出样例 13 125 Hint…
Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4100   Accepted: 1051 Description YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. After overcoming a series difficulties,…
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j)表示dp(x-1, j)对dp(x, i)的贡献.然后用矩阵快速幂就可以了. 时间复杂度O(M3logN + M) ------------------------------------------------------------------- #include<bits/stdc++.h>…
传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少种项链. 分析:这是我做过的最为综合的一道题目(太渣了),首先数位dp筛选出区间[L,R]内的幸运数字总数,dp[pos]表示非限制条件下还有pos位含有的幸运数字个数,然后记忆化搜索一下,随便乱搞的(直接dfs不知会不会超时,本人做法900+ms险过,应该直接dfs会超时),再不考虑旋转相同的情况,可以…