题意



分析

考场爆零做法

考虑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. 企业级服务元年:iClap高效解决手游更新迭代问题

    2006年至今,手游市场经历了不少变革,从WAP站到2009年智能手机时代来临,2012大量资本涌入国内手游行业,到2014年手游市场趋于成熟,细分市场成为追逐热门,在2015年优胜劣汰的资本寒冬浪潮 ...

  2. Django学习笔记之Ajax与文件上传

      Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输 ...

  3. 微信小程序:全局配置app.json

    微信小程序:全局配置app.json 一.全局配置app.json app.json文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 以下是一个包 ...

  4. 20145326 《Java程序设计》第7周学习总结

    20145326 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 一.认识Lambda语法 1.Lambda语法概览 Arrays的sort()方法可以用来排序,只不过你要 ...

  5. Cooperation.GTST团队项目总结

    Cooperation.GTST团队项目总结 项目实现情况 目前对于基本UI界面的设计已经实现,对博客园接口XML的解析也已经完成,但是还暂时无法动态获取对应数据. 几张静态预览图展示(侧滑栏设计加入 ...

  6. vim 录制宏,自动循环执行组合操作

    前言 在 vim 中录制宏的意思就是把一段操作录制下来,然后可以重复执行.打个比方,我有一个文本,一共 50000 行,我要在每一行后面加一个英文句号.这个操作如果手动做的话效率非常低.这时候我可以这 ...

  7. API设计原则(觉得太合适,转发做记录)

    API设计原则 对于云计算系统,系统API实际上处于系统设计的统领地位,正如本文前面所说,K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作,理解掌握 ...

  8. 创建一个 SQLite 数据库

    首先,我们学习如何创建一个SQLite 数据库.如果想要在data/example.sqlite 这个路径中创建一个示例数据库,就必须确保该路径存在.如果该路径不存在,就必须先创建路径:if (!di ...

  9. 【Python】使用codecs模块进行文件操作及消除文件中的BOM

    前言 此前遇到过UTF8格式的文件有无BOM的导致的问题,最近在做自动化测试,读写配置文件时又遇到类似的问题,和此前一样,又是折腾了挺久之后,通过工具比较才知道原因. 两次在一个问题上面栽更头,就在想 ...

  10. charles工具过滤腾讯视频播放器广告

    Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器,当程序连接Charles的代理访问互联网时,Charles可以监控这个程序发送和接收的所有数据.它允许一个开发者查看所有连接互联 ...