HDU.4903.The only survival(组合 计数)
题目链接
惊了
\(Description\)
给定\(n,k,L\),表示,有一张\(n\)个点的无向完全图,每条边的边权在\([1,L]\)之间。求有多少张无向完全图满足,\(1\)到\(n\)的最短路为\(k\)。
\(n,k\leq 12,\ L\leq10^9\)。
\(Solution\)
考虑暴力,直接枚举\(1\)到每个点的最短路\(d_i\)是多少。
对于方案数,如果\(d_i=d_j\),那么\(i,j\)之间的边权随便定。否则设\(d_i\lt d_j\),那么\(i,j\)之间的边权不小于\(d_j-d_i\),且对于\(j\),至少存在一个\(i\)满足\(d_i+e[i][j]=d_j\)。
这样的复杂度是\(O(12^{13})\)的(\(d_i\geq k\)的全在一起算)。
注意到我们并不关心具体\(d_i=x\)的点是哪些。所以考虑直接枚举\(d_i=x\)的点有多少个。
\(DFS\)一下,算下组合数就好啦。复杂度是\(C_{n-1+k}^k\)叭?
具体:首先要强制\(d_1=0,d_n=k\)。
对于当前的\(x\),如果有\(t\)个点\(d_i=x\),它们之间可以任意连边,方案数是,\(\prod_{i=0}^{t-1}L^i\)。(当然还要乘个组合数)
然后这\(t\)个点和之前\(m\)个点连边,不考虑存在\(d_i+e[i][j]=x\)的限制,(每个点的)方案数是\(\prod_{i=1}^{m}(L-(x-d_i)+1)\),容斥一下,再减掉\(\prod_{i=1}^{m}(L-(x-d_i))\),就可以啦。
如果要求的最短路\(\geq k\),不需要减后面那项(在边权范围内xjb连即可,不是需要恰好\(=k\))。
最后再算一下\(n\)点连边的方案数即可。
//312MS 1200K
#include <cstdio>
#include <cctype>
#include <algorithm>
#define mod 1000000007
#define gc() getchar()
typedef long long LL;
const int N=15;int n,K,L,C[N][N],now,d[N],pw[N];
LL Ans;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now;
}
void DFS(int x,int coef)
{LL c1=1,c2=1;for(int i=1; i<=now; ++i) c1=c1*(L-x+d[i]+1)%mod, c2=c2*(L-x+d[i])%mod;LL c3=c1+mod-c2;if(x==K){LL c=coef*c3%mod*pw[n-1-now]%mod;//n与其他点的贡献 for(int i=now+1; i<n; ++i) c=c*c1%mod*pw[i-now-1]%mod;Ans+=c;return;}DFS(x+1,coef);int tmp=now,t=0;for(LL c=coef; now+1<n; )d[++now]=x, c=c*c3%mod*pw[t]%mod, ++t, DFS(x+1,c*C[n-1-now+t][t]%mod);now=tmp;
}int main()
{C[0][0]=pw[0]=1;for(int i=1; i<=12; ++i){C[i][0]=C[i][i]=1;for(int j=1; j<i; ++j) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;}for(int T=read(); T--; ){n=read(),K=read(),L=read();for(int i=1; i<=n; ++i) pw[i]=1ll*pw[i-1]*L%mod;Ans=0, d[now=1]=0, DFS(1,1), printf("%lld\n",Ans%mod);}return 0;
}
转载于:https://www.cnblogs.com/SovietPower/p/10715007.html
HDU.4903.The only survival(组合 计数)相关推荐
- Sit sit sit HDU - 5151 (区间dp +组合计数)
这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题. 首先应用根据小区间推出大区间的思路,我们可以先固定一 ...
- 解题报告(五)组合计数(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 解题报告(二)E、(BZOJ3513) [MUTC2013] idiots(生成函数 + FFT + 组合计数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- CF1237F Balanced Domino Placements(组合计数,dp)
CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌.但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响. 然而 ...
- 【Luogu4921】情侣?给我烧了!(组合计数)
[Luogu4921]情侣?给我烧了!(组合计数) 题面 洛谷 题解 很有意思的一道题目. 直接容斥?怎么样都要一个平方复杂度了. 既然是恰好\(k\)对,那么我们直接来做: 首先枚举\(k\)对人出 ...
- 1307 牡牛和牝牛(组合计数-递推)
1. 问题描述: 约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛.请计算 ...
- 学组合数学心得与题解(一)——组合计数
今天我在某网站上稍微学习了一下组合数学,准确来讲,今天就看了看组合计数.像一些弱智的排列数.组合数大家肯定在小学奥数就已经精通了(只有我这种蒟蒻忘的精光).当然,博主比较菜,连二项式定理.帕斯卡恒等式 ...
- 基础组合计数常用的概念和方法总结
基础组合计数常用的概念和方法总结 一.组合计数中的基本概念与性质 1.排列 定义 性质 2.组合 定义 性质 二.组合计数中的一些常用技巧 1.容斥原理 定义 公式 2.捆绑与插空法 捆绑法 插空法 ...
- 数学知识——组合计数
组合计数 文章目录 组合计数 概述 动态规划 牡牛和牝牛 思路 代码 隔板法 方程的解 思路 代码 序列统计 思路 代码 加法 & 乘法原理 加法原理 乘法原理 车的摆放 思路 代码 容斥原理 ...
最新文章
- iOS使用多线程提高数据并发访问 之七
- Leetcode 剑指 Offer 04. 二维数组中的查找 (每日一题 20210727)
- python 装饰器是啥?
- 【WP8.1开发】RenderTargetBitmap类的特殊用途
- (软件工程复习核心重点)第九章面向对象分析-第三节:面向对象分析之建立动态模型和功能模型
- 数据结构之栈的应用(算术计算)
- 1000道Python题库系列分享五(40道)
- MySql(四):备份与恢复
- 风变编程python笔记_自学Python和风变编程
- wireshark协议
- php 微信机器人_php7 版本的微信机器人来了!(这应该是最灵活的版本了)
- java 设置jframe大小_Java Swing JFrame设置大小
- 山科OJ:Problem C: Lemon
- 有人问“一花一世界,一叶一菩提”
- 响应式布局——Bootstrap
- MSP430的485通信
- python里的π怎么输入_【后端开辟】python里的π怎样输入
- ABBYY FlexiCapture Engine使用心得分享
- CMS-页面静态化技术
- android将引入aot编译器,JIT与AOT编译模式
热门文章
- 使用 TListView 控件(3)
- 第四天上午 休闲假日
- 以太坊Geth几种同步模式
- 服务器部署基础知识_我在生产部署期间学到的知识
- ESXi6.5环境搭建(二:ESXi 6.5环境的安装及配置)
- php pthread 实例,php 真正的多线程 pthread
- 计算机组成 试题,计算机组成典型试题及答案
- (C++)输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
- 学Java需要用到的软件快收藏!
- 学习UI设计的一些小技巧你会了吗