【hdu4903】The only survival
2015-10-20 19:58
190 查看
n个点的完全图,每条边的权值在1~L间,求有多少种图使得1到n的最短路长度为k。n ,k<= 12 L <= 10^9
暴力:枚举起点到每个点的最短路di,按di从小到大排序,求出方案。
我们并不关心具体点的di,枚举每个di的数量并统计。
暴力:枚举起点到每个点的最短路di,按di从小到大排序,求出方案。
我们并不关心具体点的di,枚举每个di的数量并统计。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define Rep(i, x, y) for (int i = x; i <= y; i ++) #define Dwn(i, x, y) for (int i = x; i >= y; i --) #define RepE(i, x) for(int i = pos[x]; i; i = g[i].nex) using namespace std; typedef long long LL; const int N = 15, mod = 1000000007; int T, n, L, m, l, d ; LL ans, u , C ; void Find(int x, LL y) { LL n1 = 1, num = 1, n3, n2 = 1, t = 0, num0; Rep(j, 1, l) n1 = n1 * (L - (x - d[j] - 1)) % mod, n2 = n2 * (L - (x - d[j])) % mod; n3 = n1, n1 = (n1 - n2 + mod) % mod; if (x == m) { Rep(j, l + 1, n - 1) num = (num * n3 % mod) * u[j - l - 1] % mod; (num *= u[n - l - 1]) %= mod; (ans += (n1 * num % mod) * y) %= mod; return ; } Find(x + 1, y); while (l < n - 1) { d[++ l] = x, num = (num * n1 % mod) * u[t] % mod; t ++; num0 = num; if (l != n - 1) num0 = num0 * C[n - l + t - 1][t] % mod; Find(x + 1, y * num0 % mod); } while (d[l] == x) l --; } int main() { scanf ("%d", &T); C[0][0] = 1; Rep(i, 1, 12) { C[i][0] = 1; Rep(j, 1, 12) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod; } while (T --) { scanf ("%d%d%d", &n, &m, &L); ans = 0; u[0] = 1; Rep(i, 1, n) u[i] = u[i - 1] * L % mod; d[l = 1] = 0; Find(1, 1); printf("%I64d\n", ans); } return 0; }
相关文章推荐
- CanOpen协议【CanFestival】移植到STM32
- Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
- iOS面试题 一
- 项目管理中级
- 基于PKCS#11的应用架构
- 音乐播放器项目技术之一正在播放按钮点击
- 求总和的百分比
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest F - Infinite Go
- NIO 笔记
- 瀑布流PinterestLikeAdapterView实现原理
- 【软剑攻城队】团队编码规范文档发布!
- iOS开发之c语言基础-高级指针
- 软考中级
- yii2 分页
- ubunt连接手机adb devices ???? no permission
- PHP5 mysqli增改删表
- JAVA中,接口和抽象类的区别
- hdu1846 Brave Game
- WPF、WinForm(C#)多线程编程并更新界面(UI)
- 黑马程序员——Java中的集合(下)