题意转化

考虑我们对于集合中每一个\(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)(奇偶性讨论+动态规划)的更多相关文章

  1. 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)

    设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\ ...

  2. 【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 ...

  3. 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)

    卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...

  4. 【2019.8.6 慈溪模拟赛 T2】树上路径(tree)(Trie)

    从暴力考虑转化题意 考虑最暴力的做法,我们枚举路径的两端,然后采用类似求树上路径长度的做法,计算两点到根的贡献,然后除去\(LCA\)到根的贡献两次. 即,设\(v_i\)为\(i\)到根路径上的边权 ...

  5. 【2019.8.7 慈溪模拟赛 T2】环上随机点(ran)(自然算法)

    简单声明 我是蒟蒻不会推式子... 所以我用的是乱搞做法... 大自然的选择 这里我用的乱搞做法被闪指导赐名为"自然算法",对于这种输入信息很少的概率题一般都很适用. 比如此题,对 ...

  6. 【2019.8.8 慈溪模拟赛 T2】query(query)(分治+分类讨论)

    分治 首先,我们考虑分治处理此问题. 每次处理区间\([l,r]\)时,我们先处理完\([l,mid]\)和\([mid+1,r]\)两个区间的答案,然后我们再考虑计算左区间与右区间之间的答案. 处理 ...

  7. 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)

    树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...

  8. 【2019.8.12 慈溪模拟赛 T2】汪哥图(wang)(前缀和)

    森林 考虑到题目中给出条件两点间至多只有一条路径. 就可以发现,这是一个森林. 而森林有一个很有用的性质. 考虑对于一棵树,点数-边数=\(1\). 因此对于一个森林,点数-边数=连通块个数. 所以, ...

  9. 【2019.8.14 慈溪模拟赛 T2】黑心老板(gamble)(2-SAT)

    \(2-SAT\) 考虑每个点只能选择\(R\)或\(B\),可以看作选\(0\)或\(1\). 然后对于给出的关系式,若其中一个位置满足关系式,另两个位置就必须不满足关系式,这样就可以对于每个关系式 ...

随机推荐

  1. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) D2. Optimal Subsequences (Hard Version) 数据结构 贪心

    D2. Optimal Subsequences (Hard Version) This is the harder version of the problem. In this version, ...

  2. js 的cookie问题

    获取时解码可以用decodeURIComponent(),代替 unescape() // 设置cookiefunction setCookie(name,value) { var Days = 30 ...

  3. hibernate的对象/关系映射结果为空,exists查不到值的问题-20190823

    1: hibernate的对象/关系映射 情景:在使用@onetotone/@manytonone时关联结果为空 原因:在使用这个注解的时候,默认的时crossjoin(交叉连接),在进行查询时以及排 ...

  4. LeetCode 202: 快乐数 Happy Number

    题目: 编写一个算法来判断一个数是不是 "快乐数". 一个 "快乐数" 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直 ...

  5. Java Arrays类方法

    1:概述 主要谈一谈 Java使用fork/koin类 实现的并发排序 以及对于Stream流的支持的splitetor mismatch()   ->  寻找两个数组 第一次出现数据不一致的下 ...

  6. Java SPI机制实战详解及源码分析

    背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...

  7. Python笔记:设计模式之代理模式

    代理通常就是一个介于寻求方和提供方之间的中介系统.其核心思想就是客户端(寻求方)没有直接和提供方(真实对象)打交道,而是通过代理对象来完成提供方提供的资源或操作. 代理其实就是封装实际服务对象的包装器 ...

  8. centOS服务器基本命令

    1.卸载/安装mySQL:(因为我是该服务器的管理员,所以这些命令都不用在前面加sudo) yum remove mysqlyum install mysql 2.进入根目录 cd / 3.查看cen ...

  9. DIY客户端框架

    C/S类型的客户端做过好多轮了,在架构上每次都调整优化一部分,慢慢的形成了DIY的框架性东西. 可是最近这一看呢,已经不像MVC了,然后有一天看到了MVP概念,咦!很像.再一看,嗯,就该是MVP. M ...

  10. 程序员编程时常用的mac快捷方式

    fn + F2/F3 = 调节音量 commend + shift +k = 显示或隐藏键盘 commend+shift +h = iPhone返回主页面 commend+ shift + hh = ...