分析(官方题解):

一点感想:(这个题是看题解并不是特别会转移,当然写完之后看起来题解说得很清晰,主要是人太弱

这个题是参考faebdc神的代码写的,说句题外话,很荣幸高中和faebdc巨一个省,虽然本弱渣高中都没搞过oi)

最短路不等于k,所以根本不存在最短路>=k的,因为存在的话,由最短路知识可知,k+1一定是由k更新过来的,矛盾

所以最短路不等于k,即最短路小于k

然后就是不管是多校还是bc,都能碰到有关图的计数类的dp问题,比如2016多校1的刚性图,计算连通二分图的数量

这个题是计算无向图,满足最短路小于k的数量

这类题对于我来说比较难,看了题解以后可能还好一点,关键是定义状态

这个题定义的状态是f[i][j][k]很巧妙,在统计的时候可以保证不重不漏,在更新的时候,正好可以像求解最短路一样按距离一层一层更新

只能说还是太年轻,不能定义出这么好的状态,既方便统计,又方便转移,总得来说还是要努力提高姿势

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = ;
const LL mod = 1e9+;
int T,n,m;
inline LL up(LL x,LL y){
x+=y;if(x>=mod)x-=mod;
return x;
}
LL f[N][N][N],pw2[N*N/],pw2_1[N],c[N][N];
void init(){
for(int i=;i<=;++i){
c[i][]=c[i][i]=;
for(int j=;j<i;++j){
c[i][j]=up(c[i-][j-],c[i-][j]);
}
}
pw2_1[]=pw2[]=;
for(int i=;i<=;++i)
pw2[i]=pw2[i-]*%mod;
for(int i=;i<=;++i)
pw2_1[i]=pw2_1[i-]*%mod;
for(int i=;i<=;++i)
pw2_1[i]=up(pw2_1[i],mod-);
f[][][]=;
for(int i=;i<=;++i)
for(int j=;j<i;++j)
for(int k=;k<=i;++k){
if(!f[i][j][k])continue;
LL tmp=f[i][j][k];
for(int s=;s+i<=;++s){
tmp=tmp*pw2_1[k]%mod;LL val=tmp;
val=val*pw2[s*(s-)/]%mod;
val=val*c[s+i-][s]%mod;
f[s+i][j+][s]=up(f[s+i][j+][s],val);
}
}
}
void work(){
scanf("%d%d",&n,&m);LL ret=;
for(int i=;i<=n;++i)
for(int j=;j<m;++j)
for(int k=;k<=i;++k){
if(!f[i][j][k])continue;
LL tmp=f[i][j][k];
tmp=tmp*c[n-][n-i]%mod;
tmp=tmp*pw2[(n-i)*(n-i-)/]%mod;
ret=up(ret,tmp);
}
printf("%I64d\n",ret);
}
int main(){
init();
scanf("%d",&T);
for(int i=;i<T;++i)work();
return ;
}

HDU5779 Tower Defence (BestCoder Round #85 D) 计数dp的更多相关文章

  1. BestCoder Round #85(ZOJ1569尚未验证)

    A题 子序列和啊,就要想到前缀和的差.这个转换一定要!记着!那么i到j的一段子序列和Sij%m ==  0就等价于(Sj-Si-1)%m == 0 了,那么什么意思呢?就是如果有两段前缀和%m的模是一 ...

  2. BestCoder Round #85 hdu5778 abs(素数筛+暴力)

    abs 题意: 问题描述 给定一个数x,求正整数y,使得满足以下条件: 1.y-x的绝对值最小 2.y的质因数分解式中每个质因数均恰好出现2次. 输入描述 第一行输入一个整数T 每组数据有一行,一个整 ...

  3. BestCoder Round #85 hdu5777 domino

    domino 题意: 问题描述 小白在玩一个游戏.桌子上有n张多米诺骨牌排成一列.它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒.每个骨 牌倒下的时候,若碰到了未倒下的骨牌,可以把它推倒 ...

  4. BestCoder Round #85 hdu5776 sum

    sum 题意: 问题描述 给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出NO 输入描述 输入文件的第一行有一个正整数T,表示数据组数. 接下去有T组数据,每组数据的第一行有两个 ...

  5. HDU5780 gcd (BestCoder Round #85 E) 欧拉函数预处理——分块优化

    分析(官方题解): 一点感想: 首先上面那个等式成立,然后就是求枚举gcd算贡献就好了,枚举gcd当时赛场上写了一发O(nlogn)的反演,写完过了样例,想交发现结束了 吐槽自己手速慢,但是发了题解后 ...

  6. HDU 5778 abs (BestCoder Round #85 C)素数筛+暴力

    分析:y是一个无平方因子数的平方,所以可以从sqrt(x)向上向下枚举找到第一个无平方因子比较大小 大家可能觉得这样找过去暴力,但实际上无平方因子的分布式非常密集的,相关题目,可以参考 CDOJ:无平 ...

  7. HDU5777 domino (BestCoder Round #85 B) 思路题+排序

    分析:最终的结果肯定会分成若干个区间独立,这些若干个区间肯定是独立的(而且肯定是一边倒,左右都一样) 这样想的话,就是如何把这n-1个值分成 k份,使得和最小,那么就是简单的排序,去掉前k大的(注意l ...

  8. HDU 5776 sum (BestCoder Round #85 A) 简单前缀判断+水题

    分析:就是判断简单的前缀有没有相同,注意下自身是m的倍数,以及vis[0]=true; #include <cstdio> #include <cstdlib> #includ ...

  9. BestCoder Round #85

    sum Accepts: 640 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

随机推荐

  1. Ubuntu环境下利用ant编译nutch2.2.1 & 配置nutch2.2.1

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  2. hdu 4586 Play the Dice

    思路:设期望值为s,前m个是再来一次机会,则有 s=(a[1]+s)/n+(a[2]+s)/n+……+(a[m]+s)/n+a[m+1]/n…… 化简:(n-m)s=sum 当sum=0时,为0: 当 ...

  3. 手把手VirtualBox虚拟机下安装rhel6.4 linux 64位系统详细文档

    下面演示安装的是在VirtualBox里安装rhel 6.4 linux 64位系统. 一.VirtualBOX 版本. 二.虚拟机的配置. 1.现在开始演示安装,一起从零开始.点击“新建”,创建新的 ...

  4. hdu 1002 A+B

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002 复习一下大数 模板: #include <stdio.h> #include <s ...

  5. static int和static final int的区别

    1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内 ...

  6. 如何查看linux是32位还是64位

    可以用命令“getconf LONG_BIT”查看,如果返回的结果是32则说明是32位,返回的结果是64则说明是64位. 此外还可以使用命令“uname -a”查看,输出的结果中,如果有x86_64就 ...

  7. Nodejs实现web静态服务器对多媒体文件的支持

    前几天,一个同事说他写的web静态服务器不支持音视频的播放,现简单实现一下. 原理:实现http1.1协议的range部分. 其实这一点都不神秘,我们常用的下载工具,如迅雷,下载很快,还支持断点续传, ...

  8. 语言基础:C#运算符

    运算符 分类 符号 解释 优先级 算术运算符 ++   -- 加加  减减 由高到低,即执行顺序由上到下.(圆括号的优先级最高) *   /    % 乘  除  取余 +   - 加   减 关系运 ...

  9. 构建linux内核源码树

    编写驱动程序时,需要内核源码树的支持.内核源码树时从内核源代码编译得到的.下面开始构造内核源代码的步骤.以Ubuntu为例子 1. 下载内源代码,位置www.kernel.org. (注意:源码树内核 ...

  10. 设置UITableView section间距

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0 ...