【2019.8.11上午 慈溪模拟赛 T2】十七公斤重的文明(seventeen)(奇偶性讨论+动态规划)
题意转化
考虑我们对于集合中每一个\(i\),若\(i-2,i+k\)存在,就向其连边。
那么,一个合法的集合就需要满足,不会存在环。
这样问题转化到了图上,就变得具体了许多,也就更容易考虑、求解了。
奇偶性讨论
这题对于\(k\)为奇数/偶数的情况,要分别处理。
由于偶数情况较为简单,所以我们从偶数讲起。
当\(k\)为偶数
这时我们发现奇数和偶数是独立的。
我们分别求出奇数和偶数的方案数(\(DP(\lfloor\frac{n+1}2\rfloor,\frac k2)\)和\(DP(\lfloor\frac n2\rfloor,\frac k2)\)),然后乘起来即为总方案数。
而此时,原先的\(i-2\)现在就变成了\(i-1\),因此只要不连续选择\(k+1\)个数即可。
那么就很简单了,设\(f_{i,j}\)表示当前第\(i\)个数,已连续选择了\(j\)个数,转移分选不选讨论。
当\(k\)为奇数
可以自己在草稿纸上画个图,画两列数,一列奇数,一列偶数,其中左边每个数\(i\)与右边\(i+k\)对齐,然后连上边。
然后再对着图研究下就可以发现,若能从右边某个数开始,只往下/左两个方向走,连续选择\(k+2\)个数,就不合法了。
那么我们直接设\(f_{i,j,k}\)表示当前第\(i\)行,最多连续选的数为\(j\)个,右边已连续选择\(k\)个数,转移分左右两边选不选共四种情况讨论。
提示一下,这里用刷表法\(DP\)似乎比较方便。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 150
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,m,X;
class EvenSolver//k为偶数
{
private:
int f[N+5][N+5];
I int DP(CI n,CI m)//处理小问题
{
RI i,j,ans=0;memset(f,0,sizeof(f));//清空
for(f[0][0]=1,i=0;i^n;++i) for(j=0;j<=m;++j) Inc(f[i+1][0],f[i][j]),Inc(f[i+1][j+1],f[i][j]);//DP
for(i=0;i<=m;++i) Inc(ans,f[n][i]);return ans;//统计答案
}
public:
I void Solve() {printf("%d",1LL*DP(n+1>>1,m>>1)*DP(n>>1,m>>1)%X);}
}E;
class OddSolver//k为奇数
{
private:
int f[N+5][N+5][N+5];
public:
I void Solve()
{
RI i,j,k,ans=0;f[0][0][0]=1;//初始化
for(i=0;i<(m>>1)+(n+1>>1);++i) for(j=0;j<=(n>>1);++j) for(k=0;k<=m+1;++k)//DP
Inc(f[i+1][0][0],f[i][j][k]),i<(n>>1)&&Inc(f[i+1][j+1][0],f[i][j][k]),//两边都不选,左选右不选
i>=(m>>1)&&Inc(f[i+1][0][k?k+1:0],f[i][j][k]),//左不选右选
i>=(m>>1)&&i<(n>>1)&&Inc(f[i+1][j+1][max(j+2,k+1)],f[i][j][k]);//左右都选
for(j=0;j<=(n>>1);++j) for(k=0;k<=m+1;++k) Inc(ans,f[(m>>1)+(n+1>>1)][j][k]);//统计答案
printf("%d",ans);//输出答案
}
}O;
int main()
{
freopen("seventeen.in","r",stdin),freopen("seventeen.out","w",stdout);
return scanf("%d%d%d",&n,&m,&X),m&1?O.Solve():E.Solve(),0;
}
【2019.8.11上午 慈溪模拟赛 T2】十七公斤重的文明(seventeen)(奇偶性讨论+动态规划)的更多相关文章
- 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)
设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\ ...
- 【2019.8.11下午 慈溪模拟赛 T2】数数(gcd)(分块+枚举因数)
莫比乌斯反演 考虑先推式子: \[\sum_{i=l}^r[gcd(a_i,G)=1]\] \[\sum_{i=l}^r\sum_{p|a_i,p|G}\mu(p)\] \[\sum_{p|G}\mu ...
- 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)
卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...
- 【2019.8.6 慈溪模拟赛 T2】树上路径(tree)(Trie)
从暴力考虑转化题意 考虑最暴力的做法,我们枚举路径的两端,然后采用类似求树上路径长度的做法,计算两点到根的贡献,然后除去\(LCA\)到根的贡献两次. 即,设\(v_i\)为\(i\)到根路径上的边权 ...
- 【2019.8.7 慈溪模拟赛 T2】环上随机点(ran)(自然算法)
简单声明 我是蒟蒻不会推式子... 所以我用的是乱搞做法... 大自然的选择 这里我用的乱搞做法被闪指导赐名为"自然算法",对于这种输入信息很少的概率题一般都很适用. 比如此题,对 ...
- 【2019.8.8 慈溪模拟赛 T2】query(query)(分治+分类讨论)
分治 首先,我们考虑分治处理此问题. 每次处理区间\([l,r]\)时,我们先处理完\([l,mid]\)和\([mid+1,r]\)两个区间的答案,然后我们再考虑计算左区间与右区间之间的答案. 处理 ...
- 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)
树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...
- 【2019.8.12 慈溪模拟赛 T2】汪哥图(wang)(前缀和)
森林 考虑到题目中给出条件两点间至多只有一条路径. 就可以发现,这是一个森林. 而森林有一个很有用的性质. 考虑对于一棵树,点数-边数=\(1\). 因此对于一个森林,点数-边数=连通块个数. 所以, ...
- 【2019.8.14 慈溪模拟赛 T2】黑心老板(gamble)(2-SAT)
\(2-SAT\) 考虑每个点只能选择\(R\)或\(B\),可以看作选\(0\)或\(1\). 然后对于给出的关系式,若其中一个位置满足关系式,另两个位置就必须不满足关系式,这样就可以对于每个关系式 ...
随机推荐
- WPF Datagrid 动态生成列 并绑定数据
原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用 可 ...
- CF1253E Antenna Coverage(DP)
本题难点在正确性证明. 令 \(f_i\) 表示 \([1,i]\) 被全部覆盖的最小花费.答案为 \(f_m\). 首先发现,添加一个区间 \([0,0]\) 不会影响答案.所以 \(f_i\) 的 ...
- Python连载44-XML其他注意点
一.XML文件注意点 1.内容中不能出现尖括号 例如:下面是不合法的 <grade>成绩<90</grade> 解决方案:使用实体引用<EntityReferenc ...
- 推荐 | 中文文本标注工具Chinese-Annotator(转载)
自然语言处理的大部分任务是监督学习问题.序列标注问题如中文分词.命名实体识别,分类问题如关系识别.情感分析.意图分析等,均需要标注数据进行模型训练.深度学习大行其道的今天,基于深度学习的 NLP 模型 ...
- C++值类别, move, perfect forward
推荐看链接顺序看,第一个链接很好地讲述了值类别地特性,图形很好理解.第二个链接介绍常见值类别的示例,帮助熟悉.第三个链接是第二个链接的补充,让你理解为什么需要std::move以及perfect fo ...
- Docker - 快速入门(一)
概念 下面这三个概念一开始可能不好理解,等大家跟着博客把例子做完了,再回头来看应该就能理解了. docker image # docker镜像 镜像就是一个只读的模板.镜像可以用来创建Docker容 ...
- javascript构造函数深度克隆递归
<script type="text/javascript"> var obj={ name:'段丛磊', gex:18, sss:['李伟',18], fun:fun ...
- File文件的创建,删除 createNewFile() delete()
package seday03; import java.io.File;import java.io.IOException; /*** 使用File新建一个test1.txt文件* @author ...
- 利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏
Windbg的一些简单使用命令 一.崩溃 1. 输入.ecxr;kbn得到崩溃的堆栈 其中源代码如下 2. 查看堆栈和源代码,发现第0帧导致崩溃,代码也是本地代码 输入.frame 0,切到第0 ...
- Vuex细说
vuex 1,什么是 vuex? vuex 是一个专门为 vue.js 应用程序 开发的状态管理模式+库 它充当应用程序中所有组件的集中存储(数据状态) ,其规则确保状态只能以可预测的方式进行变更 并 ...