luogu P1357 花园】的更多相关文章

传送门 先考虑朴素dp,设\(f_{i,j}\)表示推了\(i\)次,前\(m\)个点的状态为二进制数\(j\)(这里记放C为1),转移的时候枚举下一位放什么,还要考虑是否满足C的个数\(\leq k\) 不过这个东西是环形的,考虑拆环为链,即找出所有合法状态\(j\),对于每个\(j\)初始化\(f_{0,j}=1\),然后从\(m+1\)位开始放,推\(n\)次,这个\(j\)的答案为\(f_{n,j}\) 因为\(n\)很大,同时\(j\)状态不超过32个,矩乘优化即可 // luogu-…
原题传送门 我们先将花圃断环为链,并将\([1,m]\)复制一份到\([n+1,n+m]\),最后要求\([1,n+m]\)是合法序列且\([1,m]\)与\([n+1,n+m]\)相等的序列的数量即可 \(m\)很小,珂以考虑状压,\(C\)是\(0\),\(P\)是\(1\),可以将长\(m\)的花圃压缩成一个数 我们先考虑\([1,m]\)的可行方法,直接暴力预处理 如何从\([1,m]\)转移到\([2,m+1]\):设\([1,m]\)的状态为\(a\),我们珂以将第一个数字删掉再在最…
P1357 花园 题目描述 小\(L\)有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为\(1~N(2<=N<=10^{15})\).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻\(M(2<=M<=5,M<=N)\)个花圃中有不超过\(K(1<=K<M)\)个\(C\)形的花圃,其余花圃均为\(P\)形的花圃. 例如,\(N=10,M=5,K=3\).则 \(CCPCPPPPCC\)是一种不符合规则的花圃: \(CCPPPPCPCP…
题解:洛谷P1357 花园 Description 小 L 有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为 \(1∼n\).花园 \(1\) 和 \(n\) 是相邻的. 他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则:任意相邻 \(m\) 个花圃中都只有不超过 \(k\) 个 C 形的花圃,其余花圃均为 P 形的花圃. 例如,若 \(n=10 , m=5 , k=3\) ,则 · CCPCPPPPCC 是一种不符合规则的花圃. · CCPPPPCPCP 是一种符合规则的花圃…
题目链接:传送门 题目: 题目描述 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(<=N<=^).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(<=M<=,M<=N)个花圃中有不超过K(<=K<M)个C形的花圃,其余花圃均为P形的花圃. 例如,N=,M=,K=.则 CCPCPPPPCC 是一种不符合规则的花圃: CCPPPPCPCP 是一种符合规则的花圃. 请帮小L求出符合规则的花园种数Mod 由于请您编写一个程序解…
题意 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=10^15).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<=M<=5,M<=N)个花圃中有不超过K(1<=K<M)个C形的花圃,其余花圃均为P形的花圃. 例如,N=10,M=5,K=3.则 CCPCPPPPCC 是一种不符合规则的花圃: CCPPPPCPCP 是一种符合规则的花圃. 请帮小L求出符合规则的花园种数Mod 1000000007 由于请…
题目类型:状压\(DP\) -> 矩阵乘法 绝妙然而思维难度极其大的一道好题! 传送门:>Here< 题意:有一个环形花圃,可以种两种花:0或1. 要求任意相邻的\(M\)个花中1的个数不超过\(k\)个.总共有\(N\)个花.问方案数 解题思路 非常巧妙的一道题. 先看如何拿到\(80pts\) \(N \leq 10^5\),也就是说可以\(O(n)\)带若干常数.我们发现影响当前状态的决策的仅仅就是离它最近的那\(M\)个花圃.由此可以进行状压\(DP\),\(dp[i][s]\)…
洛咕原题 题解 状压dp+矩乘 首先看到题目说M<=5,这么小的数据明显可以用状压保存相邻状态,于是可以得到一个80分的dp: 先筛出所有可用的状态,然后建立一个矩阵保存可转移的状态,再然后把每个状态都当成最初状态各跑一次dp,累计答案 然而我们发现,n太大了.又发现,其实每次转移可以直接用矩乘来搞(用到了状态矩阵) 于是就用矩乘了.嗯,就这样,具体看题解吧. #include<iostream> #include<cstdio> #include<cstring>…
题目 传送门:QWQ 分析 因为m很小,考虑把所有状态压成m位二进制数. 那么总状态数小于$ 2^5 $. 如果状态$ i $能转移到$ j $,那么扔进一个矩阵,n次方快速幂一下. 答案是对角线之和,是转移n次后回来的方案数. 代码 #include <bits/stdc++.h> typedef long long ll; ; ; using namespace std; ll tot; int sta[maxn]; struct Matrix{ ll m[maxn][maxn]; Mat…
发现$m$很小,直接状压起来,可以处理出一开始的合法的状态. 对于每一个合法的状态,可以处理出它的转移方向,即在后面填一个$1$或者填一个$0$,反着处理比较方便. 考虑一下环的情况,在这题中有一个小$trick$就是我们从一个状态$s$开始转移,转移$n$轮到达$n + m$位的情况,这样子只要计算它转移回自身的方案数就一定是合法的. 这样子就可以写方程了.设$f_{i, s}$表示到第$i$位后$m$位是$s$的方案数,这样子有$f_{i, s} = \sum f_{i - 1, s'}$ …