HDU 5779 Tower Defence(dp+组合数)
来源:互联网 发布:安徽之达大数据研究院 编辑:程序博客网 时间:2024/05/03 12:56
题目链接就:
HDU 5779 Tower Defence
题意:
小白最近痴迷于玩Tower Defence。他想要自己制作一张地图。地图是一张有n个点的无向图(图可以不连通,没有重边和自环),所
有边的长度都为1,满足从1号点到其他任意一个点的最短路都不等于k.小白想知道这样的图有多少个。如果两个顶点不连通,那么它
们之间的距离为无穷大。答案对
数据范围:
分析:
从1号点到其他任意点的最短路都不等于
对于1号点可达的点我们枚举最短路
初始化:
memset(dp, 0, sizeof(dp));dp[0][1][1] = 1;for (int i = 1; i <= n; ++i) { dp[1][i][i - 1] = 1; }
我们接着枚举最短路为
但是还要注意我们选择最短路为
从而我们还要注意到还剩下
所以统计答案:
还要记得1号点可能和其他点都不连通,所以初始化
Over。
#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std;typedef long long ll;const int MAX_N = 70;const ll mod = 1e9 + 7;int T, n, k;ll C[MAX_N][MAX_N], dp[MAX_N][MAX_N][MAX_N], fac[MAX_N * MAX_N];void init(){ C[0][0] = 1; for (int i = 1; i < MAX_N; ++i) { C[i][0] = C[i][i] = 1; for (int j = 1; j < i; ++j) { C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod; } } fac[0] = 1; for (int i = 1; i < MAX_N * MAX_N; ++i) { fac[i] = fac[i - 1] * 2 % mod; }}ll quick_pow(ll a, ll b){ ll res = 1, tmp = a % mod; while (b) { if (b & 1) res = res * tmp % mod; tmp = tmp * tmp % mod; b >>= 1; } return res;}void wyr(){ ll ans = fac[(n - 1) * (n - 2) / 2]; memset(dp, 0, sizeof(dp)); dp[0][1][1] = 1; for (int i = 1; i <= n; ++i) { dp[1][i][i - 1] = 1; } for (int j = 1; j < k; ++j) { for (int i = 2; i <= n; ++i) { for (int q = 1; q < i; ++q) { for (int p = 1; p < i - q; ++p) { ll tmp = quick_pow(fac[p] - 1, q); dp[j][i][q] += dp[j - 1][i - q][p] * tmp % mod; dp[j][i][q] %= mod; // printf("j = %d q = %d p = %d i = %d\n", j, q, p, i); // printf("dp[%d][%d][%d] = %lld\n", j, i, q, dp[j][i][q]); } int num = q * (q - 1) / 2; dp[j][i][q] = dp[j][i][q] * C[n - i + q][q] % mod * fac[num] % mod; num = (n - i) * (n - i - 1) / 2; //printf("num = %d dp[%d][%d][%d] = %lld\n", num, j, i, q, dp[j][i][q]); ans = (ans + dp[j][i][q] * fac[num] % mod) % mod; } } } printf("%lld\n", ans);}int main(){ init(); scanf("%d", &T); while (T--) { scanf("%d%d", &n, &k); wyr(); } return 0;}
0 0
- HDU 5779 Tower Defence(dp+组合数)
- HDU 5779 Tower Defence(Dp + 组合)
- HDU 5779 Tower Defence
- HDU 5779 Tower Defence(????)
- hdoj 5779 Tower Defence ??dp
- HDU 5779 BestCoder Round #85 Tower Defence ( dp升级版 )
- hdu 5886 Tower Defence(树形dp)
- [HDU 5886] Tower Defence (树形DP)
- Hdu-5886 Tower Defence(树形DP)
- HDU 5779/BC 85D Tower Defence
- HDU-5886-Tower Defence
- hdu 5886 Tower Defence 树形期望dp 雪漫防守战
- 【HDU 5886】Tower Defence(树的直径+树形DP)
- HDU 5886 Tower Defence(树形dp|树的直径)
- hdu 4779 Tower Defense(dp+组合计数)
- HDU 5886 Tower Defence (最长链预处理)
- HDU 5886 - Tower Defence(最短路+最小割)
- Tower Defence hdu3958
- 各种排序实现及比较(Java)
- C#委托深入
- 基于Qt的QQ局域网聊天
- 关于打开酷狗就无法进行android程序调试的问题
- Android--Toast的简单封装
- HDU 5779 Tower Defence(dp+组合数)
- Effective C++ Item 08-别让异常逃离析构函数
- 实现启动一个activity但不显示其界面
- C ---边走边学 (知识点)
- mybatis 常见问题 FAQ
- 在CentOS 6.6 x86_64上安装SystemTap/Perf+FlameGraph玩转火焰图实录
- 打印n对括号的全部有效组合
- 打败爱情的那件小事 七夕我想和你好好的
- 【MFC入门】之六 MFC中创建应用程序资源之菜单资源plus快捷菜单 and 快捷键