Discription:
There is an old country and the king fell in love with a devil. The devil always ask the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and can’t refuse any request from the devil. Also, this devil is looking like a very cute Loli.

Something bad actually happen. The devil makes this kingdom's people infected by a disease called lolicon. Lolicon will take away people's life in silence.

Although z*p is died, his friend, y*wan is not a lolicon. Y*wan is the only one in the country who is immune of lolicon, because he like the adult one so much.

As this country is going to hell, y*wan want to save this country from lolicon, so he starts his journey.

You heard about it and want to help y*wan, but y*wan questioned your IQ, and give you a question, so you should solve it to prove your IQ is high enough.

The problem is about counting. How many undirected graphs satisfied the following constraints?

1. This graph is a complete graph of size n. 
2. Every edge has integer cost from 1 to L. 
3. The cost of the shortest path from 1 to n is k.

Can you solve it?

output the answer modulo 10^9+7 

Input

The first line contains an integer T, denoting the number of the test cases.

For each test case, the first line contains 3 integers n,k,L.

T<=5 n,k<=12,L<=10^9.

Output

For each test case, output the answer in one line.

Sample Input

2
3 3 3
4 4 4

Sample Output

8
668 陈立杰大神出的题,想了想又写了写2h就过去了orz
题目大意就是给出n,k,L ,问有多少n个点的带标号的完全无向图,
满足1-n的最短路长度为k,且每条边的权值都>=1且<=L 。 (要不是上午ZHW点拨了几下我估计一晚上都做不出来hhh) 首先不能枚举最短路的构成,这样显然会挂掉,因为1-n可能会有很多条最短的路径; 然后考虑一下枚举每一个dis[i],代表1号节点到i号节点的最短路长度。
假设我们不用管枚举dis的时间花费,先关注一下如果dis都确定了的话如何更新答案。
先把dis从小到大排序,之后从后面的点向前面的每个节点连边(这样才能是完全图嘛。。)。
边权显然不是任意的,可以发现的是如果1到i(代表最短路长度从小到大排序后第i小点)
的最短路长度为dis[i]的话,必须满足:
1.对于所有的dis[j]<dis[i],
使得dis[j]+val(j,i)>=dis[i]
2.存在dis[j]<dis[i],
使得dis[j]+val(j,i)==dis[i]
满足上两个条件的方案数不难求,一个容斥就ojbk了。
然后再考虑dis[j]==dis[i]的点j,发现边权是多少都无所谓,所以都×L就行了。 但是可能会有点的dis>k,这可怎么办呢?
这样就设dis[i]==k(这里i!=n)的意思为1到i的最短路长度>=k,
那么我们统计这类节点的方案数就不用容斥减去了,直接乘上满足条件1的方案数就行了。 但是搜索出每个dis[i]的值是会TLE的,需要考虑一种更加高效的方法。 其实我们不必知道每个dis是多少,只需要知道对于1<=x<=k的每个x,dis[i]==x的i有多少个就行了。
这样我们改变搜索对象(实验证明这样搜索能到达的状态最多有10^5种,再乘上n^2的更新答案时间根本不虚),
中间计算的时候乘上组合数就行了(相当于算等于x的dis[i]分别对应原图中的哪些节点)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<cstring>
#define ll long long
#define ha 1000000007
using namespace std;
ll n,k,L,T,ans;
ll C[][],jc[];
ll num[],cnt=;
ll ci[][]; inline void init(){
C[][]=jc[]=;
for(int i=;i<=;i++){
C[i][]=,jc[i]=jc[i-]*(ll)i%ha;
for(int j=;j<=i;j++){
C[i][j]=C[i-][j-]+C[i-][j];
if(C[i][j]>=ha) C[i][j]-=ha;
}
}
} inline ll calc(){
ll an=,rk1,rk2,fin=num[k];
num[k]=;
//先算num<k和num==k中的n的情况。
for(int i=;i<=k;i++) if(num[i]){
rk1=rk2=;
for(int j=;j<i;j++) if(num[j]){
rk1=rk1*ci[i-j-][num[j]];
rk2=rk2*ci[i-j][num[j]];
if(rk1>=ha) rk1-=rk1/ha*ha;
if(rk2>=ha) rk2-=rk2/ha*ha;
} rk1+=ha-rk2;
if(rk1>=ha) rk1-=ha; for(int j=;j<=num[i];j++){
an=an*rk1;
rk1=rk1*L;
if(an>=ha) an-=an/ha*ha;
if(rk1>=ha) rk1-=rk1/ha*ha;
}
} //再求num==k的其他点的方案数
num[k]=fin-;
if(num[k]){
rk1=;
for(int i=;i<k;i++) if(num[i]){
rk1=rk1*ci[k-i-][num[i]];
if(rk1>=ha) rk1-=rk1/ha*ha;
} for(int j=;j<=num[k];j++){
rk1=rk1*L;
if(rk1>=ha) rk1-=rk1/ha*ha;
an=an*rk1;
if(an>=ha) an-=an/ha*ha;
}
} return an;
} void dfs(int tmp,int lef,ll alr){
if(tmp==k-){
num[k]=lef+;
ans+=alr*calc()%ha;
if(ans>=ha) ans-=ha;
return;
} for(int u=;u<=lef;u++){
ll to=alr*C[lef][u]%ha;
num[tmp+]=u;
dfs(tmp+,lef-u,to);
}
} inline void solve(){
dfs(,n,);
} int main(){
init();
scanf("%lld",&T);
while(T--){
ans=; memset(num,,sizeof(num));
memset(ci,,sizeof(ci)); scanf("%lld%lld%lld",&n,&k,&L);
if(L<k){
puts("");
continue;
} for(int i=;i<=k;i++){
ci[i][]=;
for(int j=;j<=n;j++) ci[i][j]=ci[i][j-]*(L-i+ha)%ha;
} n-=,num[]=num[k]=,solve();
printf("%lld\n",ans);
} return ;
}


												

HDOJ 4903 The only survival的更多相关文章

  1. hdu 4903 The only survival

    The only survival http://acm.hdu.edu.cn/showproblem.php?pid=4903 Time Limit: 40000/20000 MS (Java/Ot ...

  2. HDU.4903.The only survival(组合 计数)

    题目链接 惊了 \(Description\) 给定\(n,k,L\),表示,有一张\(n\)个点的无向完全图,每条边的边权在\([1,L]\)之间.求有多少张无向完全图满足,\(1\)到\(n\)的 ...

  3. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  5. HDOJ 1326. Box of Bricks 纯水题

    Box of Bricks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. HDOJ 1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  7. hdoj 1385Minimum Transport Cost

    卧槽....最近刷的cf上有最短路,本来想拿这题复习一下.... 题意就是在输出最短路的情况下,经过每个节点会增加税收,另外要字典序输出,注意a到b和b到a的权值不同 然后就是处理字典序的问题,当松弛 ...

  8. (转)A Survival Guide to a PhD

    Andrej Karpathy blog About Hacker's guide to Neural Networks A Survival Guide to a PhD Sep 7, 2016 T ...

  9. HDOJ(2056)&HDOJ(1086)

    Rectangles    HDOJ(2056) http://acm.hdu.edu.cn/showproblem.php?pid=2056 题目描述:给2条线段,分别构成2个矩形,求2个矩形相交面 ...

随机推荐

  1. 从零开始学习MXnet(四)计算图和粗细粒度以及自动求导

    这篇其实跟使用MXnet的关系不大,但对于我们理解深度学习的框架设计还是很有帮助的. 首先还是对promgramming models的一个简单介绍,这个东西实际上是在编译里面经常出现的东西,我们在编 ...

  2. Web自适应

    随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难,适配问 ...

  3. PRINT_TABLE 列以行形式显示

    在sqlplus,如果列比较多,往往会显示不够清晰,这时如果能把查询语句行转列就明了多了,在网上看到print_table存储过程:里面所设置的日期格式,可根据自己习惯修改 CREATE OR REP ...

  4. ActiveMQ(3) ActiveMQ创建(simpleAuthenticationPlugin)安全认证

    控制端安全认证: ActiveMQ目录conf下jetty.xml: <bean id="securityLoginService" class="org.ecli ...

  5. 精通javascript笔记(智能社)——简易tab选项卡及应用面向对象方法实现

    javascript代码(常规方式/面向过程): <script type="text/javascript"> window.onload=function(){ v ...

  6. web上传组件

    uploadify  jquery插件. common-fileipload; common-io ;jar

  7. java基础知识(二)-----多态和构造函数

    一:前言 最近由于面试了新浪公司,面试官问我的问题我都不知道,觉得自己好菜,所以最近决定再把java基础给搞一遍,真的觉得自己好菜.每天看一点,那个家伙说<java编程思想>最少要看三遍, ...

  8. bzoj 1880 最短路

    我们首先知道,答案肯定是最短路图中的某段公共链,那么设(x,y)为x到y的最短路,那么答案为((s1,t1)+(s2,t2)-min((s1,s2)+(t1,t2),(s1,t2),(s2,t1))) ...

  9. PHPstorm创建注释模版

    /** * $NAME$ * @param * @return * @since $DATE$ * @author Name */$END$ /** * xxxx -­- Controller – 类 ...

  10. [ Python - 8 ] 简单demo练习

    练习1: 利用os模块编写一个能实现dir -l输出的程序(注意:dir /l是windows下命令) #!_*_coding:utf-8_*_ # Author: hkey import os, t ...