3195: [Jxoi2012]奇怪的道路

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

小宇从历史书上了解到一个古老的文明。这个文明在各个方面高度发达,交通方面也不例外。考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n。m条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往。一对城市之间可能存在多条道路。
据史料记载,这个文明的交通网络满足两个奇怪的特征。首先,这个文明崇拜数字K,所以对于任何一条道路,设它连接的两个城市分别为u和v,则必定满足1 <=|u - v| <= K。此外,任何一个城市都与恰好偶数条道路相连(0也被认为是偶数)。不过,由于时间过于久远,具体的交通网络我们已经无法得知了。小宇很好奇这n个城市之间究竟有多少种可能的连接方法,于是她向你求助。
方法数可能很大,你只需要输出方法数模1000000007后的结果。

Input

输入共一行,为3个整数n,m,K。

Output

输出1个整数,表示方案数模1000000007后的结果。

Sample Input

【输入样例1】
3 4 1
【输入样例2】
4 3 3

Sample Output

【输出样例1】
3
【输出样例2】
4

HINT

100%的数据满足1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8.

【题目说明】两种可能的连接方法不同当且仅当存在一对城市,它们间的道路数在两种方法中不同。在交通网络中,有可能存在两个城市无法互相到达。

题解:

考试的时候我真的没有想到……看到了数据范围比较小,但是我想的是深搜而不是状压……

我们发现k的数据范围很小,所以我们考虑状压,首先考虑状态数组定义。

首先,f数组肯定有2维表示枚举到的点数和边数。我们发现,题目中对每个点的奇偶性有限制,而奇偶是两种相反的概念,

因此我们尝试再用一位表示可以和这个点连边的点的出度奇偶性状态,1表示奇;但是我们发现,如果这个设置为所有它能转移到的点的奇偶性(一共16位),

不仅时间复杂度变大,转移时候的讨论也会很复杂,而我们考虑一下,其实只弄一边的状态就可以了,从现在的点往后转移相当于从后面的点往前转移

因此我们只保存i点以及前面k个点的状态即可,我们再设置一维l,表示我们已经考虑到了前面k+1个点中的第l个点(我们设高位离着i点最近,第0位是点i-k,第k位是i点,一共k+1位)

于是我们得到了一个四维的状态数组,f[35][35][(1<<9)[10],接下来我们考虑转移

考虑对第i-k+l个点与第i个点,如果我们不再加边,就直接转移到下一个f[i][j][state][l+1]

如果我们再还合法的情况下加边,会同时改变i点和i-k+l这两个的出度奇偶性,也就是转移到f[i][j+1][state^(1<<k)^(1<<l)][l]

然后我们考虑不同i之间的转移。如果当前状态要转移的话,我们现在第i-k个点永远不会再被考虑,因此转移的前提之一是第i-k位奇偶性是0,即state&1==0

并且,我们还可以发现一个很有用的性质:对于点i+1,它初始state就是第i个点的state>>1,这一点很显然,从我们第3维的定义中就能看出这一操作可以实现

这样的话,就有跨第一维的转移,即向f[i+1][j][u>>1][0]转移

再最后的时候,输出f[n+1][m][0][0]即可,代码见下:

 #include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const LL mod=;
int n,m,k,bin[],f[][][(<<)+][];
int main()
{
scanf("%d%d%d",&n,&m,&k);
bin[]=;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
f[][][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int u=;u<bin[k+];u++)
{
for(int l=;l<k;l++)
if(f[i][j][u][l])
{
(f[i][j][u][l+]+=f[i][j][u][l])%=mod;
if(j<m&&i-k+l>)
(f[i][j+][u^bin[k]^bin[l]][l]+=f[i][j][u][l])%=mod;
}
if((u&)==&&f[i][j][u][k])
f[i+][j][u>>][]=f[i][j][u][k];
}
printf("%d",f[n+][m][][]);
}

[BZOJ3195][Jxoi2012]奇怪的道路的更多相关文章

  1. BZOJ3195: [Jxoi2012]奇怪的道路【状压DP】

    Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每 ...

  2. bzoj3195: [Jxoi2012]奇怪的道路(状压dp)

    Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每 ...

  3. 2018.10.24 bzoj3195: [Jxoi2012]奇怪的道路(状压dp)

    传送门 f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个点连了jjj条边,第i−K+1i-K+1i−K+1~iii个点连边数的奇偶性为kkk时的方案数. 转移规定只能从后向前 ...

  4. bzoj3195 [Jxoi2012]奇怪的道路——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3195 看到数据范围就应该想到状压呢... 题解(原来是这样):https://www.cnb ...

  5. 【BZOJ3195】[Jxoi2012]奇怪的道路 状压DP

    [BZOJ3195][Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座 ...

  6. 【BZOJ-3195】奇怪的道路 状压DP (好题!)

    3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 305  Solved: 184[Submit][Statu ...

  7. [补档][Jxoi2012] 奇怪的道路

    [Jxoi2012] 奇怪的道路 题目 传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3195 小宇从历史书上了解到一个古老的文明.这个文明 ...

  8. bzoj 3195 [Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编 ...

  9. 【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】

    3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 802  Solved: 529[Submit][Statu ...

随机推荐

  1. SaltStack入门篇(三)之数据系统Grains、Pillar

    1.什么是Grains? Grains是saltstack的组件,用于收集salt-minion在启动时候的信息,又称为静态信息.可以理解为Grains记录着每台Minion的一些常用属性,比如CPU ...

  2. cogs2223 [SDOI2016 Round1] 生成魔咒

    cogs2223 [SDOI2016 Round1] 生成魔咒 原题链接 题解 暴力:每次更新后缀数组??? set+二分+hash暴力 http://paste.ubuntu.com/2549629 ...

  3. ABP中module-zero快速集成微信用户认证

     https://personball.com/abp/2019/01/01/introduce-abp-module-zero-external-authenticate 

  4. python Matplotlib数据可视化神器安装与基本应用

    Matplotlib Matplotlib 是一个非常强大的 Python 画图工具; 手中有很多数据, Matplotlib能帮你画出美丽的: 线图; 散点图; 等高线图; 条形图; 柱状图; 3D ...

  5. [C++]C++得到最大的int值

    要得到最大的int值: 利用(unsigned int)-1,这样得到的就是unsigned int表示的最大值, int值只是比unsigned int多一位符号位,所以对(unsigned int ...

  6. JUC——线程同步锁(锁处理机制简介)

    锁处理机制简介 juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题. 为了解决这样的缺陷,juc里面重新针对于锁的概念进行 ...

  7. 2018 ACM-ICPC World Finals - Beijing F.Go with the Flow

    先枚举所有的列长度 对于每种列长度,然后里面用dp算 #include <algorithm> #include <cmath> #include <cstdio> ...

  8. tendermint 跟tikv结合

    import ( "fmt" "github.com/allegro/bigcache" "github.com/kooksee/usmint/cmn ...

  9. php 通过curl上传图片

    通过curl上传图片 PHP < 5.5: 使用 目前使用的php版本 7.1 测试无法使用 前面加@ 的方法上传文件 ,查找资料 使用 curl_setopt($ch,CURLOPT_SAFE ...

  10. "Hello World"团队召开的第三周第六次会议

    今天是我们团队“Hello World!”团队召开的第三周的第六次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时 ...