BZOJ3868 : The only survival
枚举每个点到$1$的距离,若$>k$则视为$k+1$,那么$d_1=1,d_n=k$。
对于$i$,如果$1\leq d_i\leq k$,则一定要存在一条边长度为$d_i-d_j$,且其他边长度都要$\geq d_i-d_j$。
如果$d_i>k$,那么对于每条边都满足长度$>k-d_j$。
枚举每个$d$的个数,通过排列组合进行指派,然后通过DP计算方案数。
状态为$f[i][j]$表示$x$考虑了$1$到$i$这些点的连边,是否存在一条边使得这个距离合法的方案数。
时间复杂度$O(nB(n))$。
#include<cstdio>
const int N=15,P=1000000007;
int T,n,k,L,i,j,C[N][N],d[N],now,ret,f[2],ans;
inline int fix(int x){return x<L?x:L;}
void dfs(int x,int y,int z,int now){
if(x==2&&y==0)return;
d[x]=y;z|=y==k;
if(x>1)if(y<=k){
f[0]=1,f[1]=0;
for(i=1;i<x;i++)if(d[i]==y){
f[0]=1LL*f[0]*L%P;
f[1]=1LL*f[1]*L%P;
}else{
f[1]=(1LL*f[1]*(L-y+d[i]+1)+f[0])%P;
f[0]=1LL*f[0]*(L-y+d[i])%P;
}
now=1LL*now*f[1]%P;
}else for(i=1;i<x;i++)now=1LL*now*fix(L-k+d[i])%P;
if(x==n){
if(!z)return;
for(ret=n-2,i=2;i<=n;i=j){
for(j=i;j<=n&&d[i]==d[j];j++);
if(d[i]==k)i++;
now=1LL*now*C[ret][j-i]%P;
ret-=j-i;
}
ans=(ans+now)%P;
return;
}
for(;y<=k+1;y++)dfs(x+1,y,z,now);
}
int main(){
for(C[0][0]=i=1;i<N;i++)for(C[i][0]=j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&k,&L);
if(n==1||k>L){puts("0");continue;}
if(n==2){puts("1");continue;}
dfs(1,ans=0,0,1);
printf("%d\n",ans);
}
return 0;
}
BZOJ3868 : The only survival的更多相关文章
- (转)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 ...
- survival analysis 生存分析与R 语言示例 入门篇
原创博客,未经允许,不得转载. 生存分析,survival analysis,顾名思义是用来研究个体的存活概率与时间的关系.例如研究病人感染了病毒后,多长时间会死亡:工作的机器多长时间会发生崩溃等. ...
- (转) A Survival Guide to a PhD
A Survival Guide to a PhD Sep 7, 2016 This guide is patterned after my “Doing well in your courses”, ...
- JSBinding + SharpKit / 实战:转换 Survival Shooter
从 asset store 下载 Survival Shooter (商店里有2个版本,一种是给Unity5用的,一个是给Unity4.6用的,我们这个实验用的是后者,版本是2.2.如果) 1 删除多 ...
- A Mathematician‘s Survival Guide Graduate School and Early Career Development
推荐大家一本书尤其是即将读研究生或者研一研二的学生: A Mathematician‘s Su ...
- 生存模型(Survival Model)介绍
https://www.cnblogs.com/BinbinChen/p/3416972.html 生存分析,维基上的解释是: 生存分析(Survival analysis)是指根据试验或调查得到的数 ...
- [LightOJ 1265] Island of Survival
Island of Survival You are in a reality show, and the show is way too real that they threw into an i ...
- Survival Analysis
code{white-space: pre;} Survival Analysis Zhu Lin 2017-3-18 What is Survival Analysis Survival analy ...
- Spark2 生存分析Survival regression
在spark.ml中,实现了加速失效时间(AFT)模型,这是一个用于检查数据的参数生存回归模型. 它描述了生存时间对数的模型,因此它通常被称为生存分析的对数线性模型. 不同于为相同目的设计的比例风险模 ...
随机推荐
- 数据存储--sqlite总结
SQLite SQLite(轻量级的数据库,关系型数据库) 辅助工具:Navicat Premium 等 原理:ios针对存储问题封装了sqlite数据库(c语言数据库). 1 app获取沙盒地址命名 ...
- 二、JavaScript语言--事件处理--DOM事件探秘--下拉菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CLR via C#(09)-扩展方法
对于一些现成的类,如果我们想添加一些新的方法来完善功能,但是不想改变已有的封装,也不想使用派生类,那么该怎么办呢?这里我们可以使用扩展方法. 一见钟情--初识扩展 扩展方法使您能够向现有类型“添加”方 ...
- Mysql中文乱码问题完美解决方案
drop database`netctoss_demo` ;CREATE DATABASE `netctoss_demo` CHARACTER SET 'utf8' COLLATE 'utf8_gen ...
- 【译】DotNet 5.4或者说 .NET平台标准
原文:DotNet 5.4 or .NET Platform Standards 是的,你看到的确实是"DotNet 5.4".使用Visual Studio 2015 RC1 u ...
- HDU4288 Coder(线段树)
注意添加到集合中的数是升序的,先将数据读入,再离散化. sum[rt][i]表示此节点的区域位置对5取模为i的数的和,删除一个数则右边的数循环左移一位,添加一个数则右边数循环右移一位,相当于循环左移4 ...
- LINQ To DataSet 示例
如果在项目遇到这样的问题如:DataTable1和DataTable2需要根据一定的规则进行合并成一个DataTable3. 问题1:DataTable1不是读数据库表的结果,而是合成的数据集,因此无 ...
- 攻城狮在路上(叁)Linux(二十二)--- linux磁盘挂载与卸载 mount umount
挂载就是将文件系统与目录结合的操作.挂载点就是目录,该目录就是进入分区或文件系统的入口. 一.挂载前的注意事项: 1.单一文件系统不应该被重复挂载在不同的挂载点中. 2.单一目录不应该重复挂载多个文件 ...
- <转>Hibernate的优、缺点(局限性)
本文原文链接:http://hi.baidu.com/ko22223/item/dd9f6900015adc036d904877 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象 ...
- 数据结构之图 Part3 – 1 遍历
DFS using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...