Written with StackEdit.

Description

小宇从历史书上了解到一个古老的文明。这个文明在各个方面高度发达,交通方面也不例外。考古学家已经知道,这个文明在全盛时期有\(n\)座城市,编号为\(1..n\)。\(m\)条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往。一对城市之间可能存在多条道路。

据史料记载,这个文明的交通网络满足两个奇怪的特征。首先,这个文明崇拜数字\(K\),所以对于任何一条道路,设它连接的两个城市分别为\(u\)和\(v\),则必定满足\(1 <=|u - v| <= K.\)此外,任何一个城市都与恰好偶数条道路相连(\(0\)也被认为是偶数)。不过,由于时间过于久远,具体的交通网络我们已经无法得知了。小宇很好奇这\(n\)个城市之间究竟有多少种可能的连接方法,于是她向你求助。

方法数可能很大,你只需要输出方法数模\(10^9+7\)后的结果。

Input

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

Output

输出\(1\)个整数,表示方案数模\(10^9+7\)后的结果。

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.\)

两种可能的连接方法不同当且仅当存在一对城市,它们间的道路数在两种方法中不同。

在交通网络中,有可能存在两个城市无法互相到达。

Solution

  • \(K\)的范围较小,考虑设计状态数目与\(K\)有关的状压\(dp\).
  • \(f[i][j][S][l]\)表示考虑到第\(i\)个点,使用了\(j\)条边.
  • \(S\)只用压缩\(i-k\)~\(i\)的度数奇偶性,因为前面的点是无法再被连边的.
  • \(l\)表示当前处理\(i\)向\(i-l\)连边.
  • 那么枚举\(i,j,S,l\),按照状态定义连边或不连边转移.
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LoveLive;
  4. inline int read()
  5. {
  6. int out=0,fh=1;
  7. char jp=getchar();
  8. while ((jp>'9'||jp<'0')&&jp!='-')
  9. jp=getchar();
  10. if (jp=='-')
  11. {
  12. fh=-1;
  13. jp=getchar();
  14. }
  15. while (jp>='0'&&jp<='9')
  16. {
  17. out=out*10+jp-'0';
  18. jp=getchar();
  19. }
  20. return out*fh;
  21. }
  22. const int P=1e9+7;
  23. inline int add(int a,int b)
  24. {
  25. return (a+b) % P;
  26. }
  27. inline int mul(int a,int b)
  28. {
  29. return 1LL * a * b % P;
  30. }
  31. const int MAXN=32,MAXK=10;
  32. int n,m,k;
  33. int f[MAXN][MAXN][1<<MAXK][MAXK];
  34. int main()
  35. {
  36. n=read(),m=read(),k=read();
  37. f[1][0][0][1]=1;
  38. for(int i=1;i<=n;++i)
  39. {
  40. for(int j=0;j<=m;++j)
  41. {
  42. for(int s=0;s<(1<<(k+1));++s)
  43. {
  44. for(int l=1;l<=k;++l)//从i向i-l连边.避免重复计数
  45. {
  46. int res=f[i][j][s][l];
  47. f[i][j][s][l+1]=add(f[i][j][s][l+1],res);//不连边直接转移
  48. if(l<=i-1)
  49. {
  50. int news=s^(1<<k)^(1<<(k-l));
  51. f[i][j+1][news][l]=add(f[i][j+1][news][l],res);
  52. }
  53. }
  54. if((s&1)==0)//度数为偶,符合条件,不再考虑
  55. f[i+1][j][s>>1][1]=add(f[i+1][j][s>>1][1],f[i][j][s][k]);
  56. }
  57. }
  58. }
  59. printf("%d\n",f[n][m][0][k]);
  60. return 0;
  61. }

bzoj 3195 奇怪的道路的更多相关文章

  1. bzoj 3195 奇怪的道路 状压dp

    看范围,状压没毛病 但是如果随便连的话给开1<<16,乘上n,m就爆了 所以规定转移时只向回连边 于是想状态数组:f[i][j]表示到i这里i前K位的状态为j(表示奇偶) 发现有条数限制, ...

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

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

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

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

  4. BZOJ 3195 [Jxoi2012]奇怪的道路 | 状压DP

    传送门 BZOJ 3195 题解 这是一道画风正常的状压DP题. 可以想到,\(dp[i][j][k]\)表示到第\(i\)个点.已经连了\(j\)条边,当前\([i - K, i]\)区间内的点的度 ...

  5. 3195: [Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 链接 思路: 因为一个点只会和它前后k个点连边,所以,记录下每个点的前k个点和它自己(共k+1个点)的状态,1表示奇数,0表示偶数. dp[i][j][s] ...

  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. [BZOJ3195][Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小宇从历史书上了解到一个古老的文明.这个文明在各个 ...

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

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

随机推荐

  1. Ubuntu 16.04 安装Django

    > pip install django==1.10.3......或者:> pip3 install django==1.10.3(我采用)......或者:>python3 -m ...

  2. 关于Simplicity Studio使用math.h编译出错

    原因是未调用C标准库. 解决方法: 1.点项目右键——>properties——>C/C++Build——>Settings——>GNU ARM C Linker——>L ...

  3. xcode9打包问题

    xcode9打包找不到icon http://blog.csdn.net/yohunl/article/details/78065656 换用xcode8打包 https://www.cnblogs. ...

  4. C#470多例winform 界面特效的源码

    一共470多例winform 界面特效的源码. 窗体与界面设计... 9 实例001  带历史信息的菜单    10 实例002  菜单动态合并    12 实例003  像开始菜单一样漂亮的菜单.. ...

  5. RENOUNCEMENT

    I must not think of thee;and,tired yet syrong,I shun the thought that lurks in all delight--The thou ...

  6. JNIjw06

    1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw06.h" // 全局变量 jfieldID g_pro ...

  7. Kubernetes源码之旅:从kubectl到API Server

    概述: Kubernetes项目目前依然延续着之前爆炸式的扩张.急需能够理解Kubernetes原理并且贡献代码的软件开发者.学习Kubernetes源码并不容易.Kubernetes是使用相对年轻的 ...

  8. Python SQL相关操作

    环境 Anaconda3 Python 3.6, Window 64bit 目的 从MySQL数据库读取数据,进行数据查询.关联 代码 # -*- coding: utf-8 -*- "&q ...

  9. App如何推广秘籍之”渠道为王”

    现在市场上主流的APP从开发环境和搭载系统上来区分主要分为三种类型,它们是适用于iphone手机的ios版本.适用于安卓手机的 android版本和适用于window phone的WP8系统.由于每个 ...

  10. Qt WebKit 学习的说明

    (转自:http://it.100xuexi.com/view/otdetail/20120827/4021c662-b917-44d9-8284-910cac713c23.html) QT Webk ...