题意



分析

考场爆零做法

考虑dp,用\(f(i,j,0/1)\)表示i及其子树中形成j个边连通块的方案数,其中i是否向外连边。

\(O(n^3)\),转移方程太复杂就打挂了。

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=3e2+7,mod=1e9+7;
int n; struct Edge
{
int nx,to;
}E[MAXN<<1];
int head[MAXN],ecnt; void addedge(int x,int y)
{
E[++ecnt].to=y;
E[ecnt].nx=head[x],head[x]=ecnt;
} ll f[MAXN][MAXN][2]; void dfs(int x,int fa)
{
// cerr<<"dfsing "<<x<<endl;
f[x][0][0]=1;
for(int i=head[x];i;i=E[i].nx)
{
int y=E[i].to;
if(y==fa)
continue;
dfs(y,x);
for(int j=(n>>1);j>0;--j)
{
// cerr<<" con "<<j<<endl;
ll t1=0,t2=0,t3=0; // edit 1
for(int k=0;k<=j;++k)
{
t1 += f[x][k][0] * f[y][j-k][0] % mod;
t1 += f[x][k][0] * f[y][j-k][1] % mod;
t3 += f[x][k][1] * f[y][j-k][0] % mod;
t3 += f[x][k][1] * f[y][j-k][1] % mod;
t1 %= mod,t3 %= mod;
if(j-k-1>=0)
t2 += f[x][k][0] * f[y][j-k-1][0] % mod;
t2 += f[x][k][1] * f[y][j-k][0] % mod;
t2 += f[x][k][0] * f[y][j-k][1] % mod;
t2 += f[x][k][1] * f[y][j-k+1][1] % mod;
t2 %= mod;
// cerr<<"\tuse "<<k<<" t1="<<t1<<" t2="<<t2<<endl;
}
// cerr<<" t1="<<t1<<" t2="<<t2<<endl;
(f[x][j][0] += t1) %= mod;
(f[x][j][1] += t3 + t2) %= mod;
}
}
/* for(int j=0;j<=(n>>1);++j)
{
cerr<<"f["<<x<<"]["<<j<<"][0]="<<f[x][j][0]<<endl;
cerr<<"f["<<x<<"]["<<j<<"][1]="<<f[x][j][1]<<endl;
}*/
} int main()
{
freopen("changchun.in","r",stdin);
freopen("changchun.out","w",stdout);
read(n);
for(int i=1;i<n;++i)
{
int x,y;
read(x);read(y);
addedge(x,y);
addedge(y,x);
}
dfs(1,0);
ll ans=0;
for(int i=1;i<=(n>>1);++i)
{
(ans += i * (f[1][i][0] + f[1][i][1]) % mod) %= mod;
}
printf("%lld\n",2 * ans % mod);
// fclose(stdin);
// fclose(stdout);
return 0;
}

标解

首先说一下前排的L君的做法。

先算贡献乘以方案的乘积

点连通块的个数=断边的个数+1,所以乘积

\[=\sum_{i=0}^{n-1} (i+1) \binom{n-1}{i}
\]

边连通块的个数=点连通块的个数-大小为一的点连通块数,所以乘积

\[=\sum_{i=0}^{n-1} (i+1) \binom{n-1}{i} - \sum_{i=1}^{n}2^{n-1-deg_i}
\]

然后算期望

总情况数\(=2^{n-1}\),由于答案要乘\(2^n\),所以答案等于上面的乘积乘2。

再说一下后排的L君的直觉正确做法。

直接算点连通块的期望

点连通块的乘积

\[\sum_{i=0}^{n-1}(i+1) \binom{n-1}{i} \\
=\sum_{i=0}^{n-1}\frac{n+1}{2} \binom{n-1}{i} \\
=\frac{n+1}{2} \sum_{i=0}^{n-1} \binom{n-1}{i} \\
=\frac{n+1}{2}2^{n-1} \\
\]

所以点连通块的期望可以化简。

综上

期望为

\[(n+1)2^{n-1}-\sum_{i=1}^{n}2^{n-deg_i}
\]

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=1e6+8,mod=1e9+7;
int deg[MAXN];
int pow2[MAXN]; int main()
{
freopen("changchun.in","r",stdin);
freopen("changchun.out","w",stdout);
int n;
read(n);
pow2[0]=1;
for(int i=1;i<n;++i)
{
int x,y;
read(x);read(y);
++deg[x],++deg[y];
pow2[i] = pow2[i-1] << 1;
if(pow2[i] >= mod)
pow2[i] -= mod;
}
int ans = (ll)(n + 1) * pow2[n-1] % mod;
for(int i=1;i<=n;++i)
{
(ans += mod - pow2[n - deg[i]]) %= mod;
}
printf("%d\n",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}

最后说一下B君的精妙做法

考虑一条边对点连通块个数的贡献,不断+1,断掉+0.5,所以就有该式。

test20181018 B君的第一题的更多相关文章

  1. test20181017 B君的第一题

    题意 分析 考场做法 对p的幂打表发现,我们一定可以把x和y的二进制位从低到高依次调整成0. 具体而言,从0次幂开始每两个分为一组a,b,那么0,a,b,a+b组合中的一种可以将x,y的对应二进制位都 ...

  2. test20181016 B君的第一题

    题意 分析 考场爆零做法 考虑位数少的一定更小,高位小的一定更少. 然后计算一定位数下不同数字的个数,然后从高到低依次确定数位. 特例:如果确定的高位的后缀出现了x,那么要把x调整到后缀去,这样一定更 ...

  3. test20181020 B君的第一题

    题意 分析 二次剩余问题. x,y相当于二次方程 \[ x^2-bx+c=0 \mod{p} \] 的两根. 摸意义下的二次方程仍然考虑判别式\(\Delta=b^2-4c\). 它能开根的条件是\( ...

  4. test20181019 B君的第一题

    题意 分析 考场做法同标解. 画图模拟分析发现,无论操作顺序怎样,操作数的奇偶性是不变的. 所以等同求出,以每点为根的操作数奇偶性. 用\(f(x)\)表示x及其子树中的边,包括x到它fa的边,将他们 ...

  5. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

    上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...

  6. 《学习OpenCV》练习题第五章第一题ab

    这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...

  7. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  8. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  9. Google Code Jam 第一题

    通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...

随机推荐

  1. Mail.Ru Cup 2018 Round 2 Solution

    A. Metro Solved. 题意: 有两条铁轨,都是单向的,一条是从左往右,一条是从右往左,Bob要从第一条轨道的第一个位置出发,Alice的位置处于第s个位置,有火车会行驶在铁轨上,一共有n个 ...

  2. uva 1456

    这题说的是 给了 n 个 点 然后每个点 都有 相应的概率,你要将这n个点划分成w个集合使得 下面定义的这种算法 得到的 值最小 n1 是集合一的 个数  是 集合一内的每个点的概率和, 下面是分成两 ...

  3. javascript模式(2)--模块模式

    在nodeJs中,可以定义自己的模块,然后通过exports来暴露API.一般是这么写的:模块依赖,私有成员和要暴露的对象.在原生js中也可以有类似的写法来组织自己的代码.可以提供一个松耦合.结构清晰 ...

  4. 20145329 《网络对抗技术》MS08_067远程漏洞攻击

    MS08_067远程漏洞攻击:shell 实现攻击的前提是:攻击机和靶机在同一个网段下,首先将kali的ip改为与winxp的ip一样,二者能ping通 两台虚拟机: kali ip:192.168. ...

  5. sql批处理(batch)的简单使用

    批处理指的是一次操作中执行多条SQL语句,相比于一次一次执行效率会提高很多 批处理主要是分两步: 将要执行的SQL语句保存 执行SQL语句 Statement和PreparedStatement都支持 ...

  6. Gym 101246J Buoys(三分查找)

    http://codeforces.com/gym/101246/problem/J 题意: 给定x轴上的n个点的坐标,按顺序从左到右给出,现在要使得每个点的间距相同,可以移动每个点的坐标,但是不能改 ...

  7. 安全之路:Web渗透技术及实战案例解析(第2版)

    安全之路:Web渗透技术及实战案例解析(第2版)

  8. BZOJ 2806 【CTSC2012】 Cheat

    题目链接:Cheat 话说这道题很久以前某人就给我们考过,直到现在,我终于把这个坑填上了…… 这道题要我们把一个串\(S\)划分成若干块,每块长度不小于\(L_0\),使得能够在文章库中完全匹配的块的 ...

  9. python 字符串压缩

    import zlib s = b'witch which has which witches wrist watch' print(len(s)) t = zlib.compress(s) prin ...

  10. Strategy(策略)

    意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 适用性: 许多相关的类仅仅是行为有异.“策略”提供了一种用多个行为中的一个行为来配置 ...