题意



分析

考场爆零做法

考虑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. 69. Sqrt(x)(二分查找)

    Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...

  2. hdu6158 The Designer

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6158 题目: The Designer Time Limit: 8000/4000 MS (J ...

  3. 2017-2018-2 20165207实验二《Java面向对象程序设计》实验报告

    2017-2018-2 20165207实验二<Java面向对象程序设计>实验报告 课程:Java程序设计 班级:1652 姓名:李天林 学号:20165207 实验日期:2018年4月1 ...

  4. linux 常用命令总结(一)

    1. 字符串常用命令: 替换: 1). %s/*/*/g 中,替换当前界面的所有符合规则的内容.      2). 替换文件中的字符串内容: find -name '要查找的文件名' | xargs ...

  5. 前端学习笔记之CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解

    派生选择器用的很多,派生选择器具体包括为后代选择器.子元素选择器.相邻兄弟选择器,我们来理解一下他们之间的具体用法与区别. 1.css后代选择器语法:h1 em {color:red;} 表示的是从h ...

  6. Javaworkers团队第二周项目总结

    本周项目进展 本周我们小组成员在图书馆和网上查阅了很多资料,基本达到了预期的计划,完成了项目框架设计及代码模块设计. 设计思路 1.首先,根据用户需求合理分配代码密度,即: 用户直接操作(点击运行)的 ...

  7. c#pdf查看器

    Free Spire.PDF for .NET is a Community Edition of the Spire.PDF for .NET, which is a totally free PD ...

  8. C# typeof 与GetType()的区别

    C#中Type类的介绍:https://msdn.microsoft.com/zh-cn/library/system.type(VS.80).aspx C#中任何对象都具有GetType()方法,它 ...

  9. vue-cli 3 is not a modual err

    <srcipt> </srcipt> don't empty normal write <srcipt> export default {}; </scrip ...

  10. 【Mysql】修改mysql的字符集和默认存储引擎,解决数据入库乱码问题

    背景 在使用Python + Testlink做自动化的过程中,遇到了数据入库出现乱码的情况,后来通过修改字符集的方式解决了这个问题.下面的内容主要来自于一篇相关博文,博主做了细微的调整, 原文链接: ...