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. HDU 1203 01背包

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  3. HUSTOJ增加其他语言出现RuntimeError解决办法

    HUSTOJ增加其他语言,如Python.Java.Pascal等等,如果程序是正确的,却报运行错误,添加okcall就行. 具体错误可以看日志: [ERROR] A Not allowed syst ...

  4. Java多线程调试如何完成信息输出处理

    转载自:http://developer.51cto.com/art/201003/189078.htm Java多线程调试是很繁琐的,但是还是需要我们不断进行相关的学习.下面我们就来看看在Java多 ...

  5. eclipse+jetty+web项目调试---不显示源码

    本人eclipse版本:JUNO 1.问题现象:显示源码时,不显示箭头(指示到哪行) 解决办法: debug configurations  --->Goals设置参数  clean -X je ...

  6. [洛谷P2420] 让我们异或吧

    题目链接:让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是 ...

  7. Quartus ModelSim联合仿真中的RAM初始化

    Modelsim只支持Hex格式的初始化文件,文件需要放在仿真的根目录下,例如:.\simulation\modelsim:并且在利用Quartus宏生成IP时,选择的初始化文件必须用绝对路径!否则M ...

  8. HDU4889 Scary Path Finding Algorithm

    Fackyyj loves the challenge phase in TwosigmaCrap(TC). One day, he meet a task asking him to find sh ...

  9. 【洛谷 P4168】[Violet]蒲公英(分块)

    题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...

  10. bzoj 2245 费用流

    比较裸 源点连人,每个人连自己的工作,工作连汇,然后因为人的费用是 分度的,且是随工作数非降的,所以我们拆边,源点连到每个人s+1条边 容量是每段的件数,费用是愤怒 /**************** ...