test20181018 B君的第一题
题意
分析
考场爆零做法
考虑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,所以乘积
\]
边连通块的个数=点连通块的个数-大小为一的点连通块数,所以乘积
\]
然后算期望
总情况数\(=2^{n-1}\),由于答案要乘\(2^n\),所以答案等于上面的乘积乘2。
再说一下后排的L君的直觉正确做法。
直接算点连通块的期望
点连通块的乘积
=\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} \\
\]
所以点连通块的期望可以化简。
综上
期望为
\]
#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君的第一题的更多相关文章
- test20181017 B君的第一题
题意 分析 考场做法 对p的幂打表发现,我们一定可以把x和y的二进制位从低到高依次调整成0. 具体而言,从0次幂开始每两个分为一组a,b,那么0,a,b,a+b组合中的一种可以将x,y的对应二进制位都 ...
- test20181016 B君的第一题
题意 分析 考场爆零做法 考虑位数少的一定更小,高位小的一定更少. 然后计算一定位数下不同数字的个数,然后从高到低依次确定数位. 特例:如果确定的高位的后缀出现了x,那么要把x调整到后缀去,这样一定更 ...
- test20181020 B君的第一题
题意 分析 二次剩余问题. x,y相当于二次方程 \[ x^2-bx+c=0 \mod{p} \] 的两根. 摸意义下的二次方程仍然考虑判别式\(\Delta=b^2-4c\). 它能开根的条件是\( ...
- test20181019 B君的第一题
题意 分析 考场做法同标解. 画图模拟分析发现,无论操作顺序怎样,操作数的奇偶性是不变的. 所以等同求出,以每点为根的操作数奇偶性. 用\(f(x)\)表示x及其子树中的边,包括x到它fa的边,将他们 ...
- [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正
上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...
- 《学习OpenCV》练习题第五章第一题ab
这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...
- 《学习OpenCV》练习题第四章第一题b&c
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- 《学习OpenCV》练习题第四章第一题a
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- Google Code Jam 第一题
通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...
随机推荐
- 【转载】Java动态代理之JDK实现和CGlib实现(简单易懂)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是 ...
- 从知乎了解到,为什么Mysql禁用存储过程、外键和级联?
打开帖子直接一张醒目的图,是阿里巴巴的Java开发手册对Mysql相关的要求. 看看下面的回复 灵剑 存储过程没有版本控制,版本迭代的时候要更新很麻烦.存储过程如果和外部程序结合起来用,更新的时候很难 ...
- P1052 过河(离散化+dp)
P1052 过河 dp不难,重点是要想到离散化. 石子个数$<=100$意味着有大量空间空置,我们可以缩掉这些空间. 实现的话自己yy下就差不多了. #include<iostream&g ...
- PhpStorm 10.0.3破解版下载
汉化破解版软件下载: http://pan.baidu.com/s/1geNO24r 密码: d5ci 这个汉化破解软件解决了大纲视图里空白的问题. 先安装腾讯电脑管家,然后安装这个软件,安装到最后提 ...
- ubuntu 16.04下更换源和pip源【转】
本文转载自:https://blog.csdn.net/weixin_41500849/article/details/80246221 写在前面的话 本文主要内容是更换系统源为清华大学源,更换pyt ...
- [问题解决]win10误删启动项(BCD)(HP电脑亲测,无需启动盘,并非重装系统)
昨天使用easyBCD软件,开始不太懂,手残把win10的引导删除了,后来发现电脑关机总是变成重启,无奈强制关机.今天重启了一下电脑,发现电脑已经无法打开了,这才明白昨天是误删了win10的BCD. ...
- CF_400_D
codeforces_400_D 题目大意:给出n扇门,m把钥匙,和没把钥匙可以改变状态(关->开,开->关>)的门的数量及对应编号(保证每个门被两把钥匙控制),现给出n扇门的初始状 ...
- root权限和sudo得到权限的区别
参考: 知乎 命令前加sudo执行和用真正的root用户执行有什么区别?pansz的回答 root用户和sudo使用root权限的区别 变换用户身份为root的方法su 与 sudo root权限和s ...
- [转]Python的getattr(),setattr(),delattr(),hasattr()
getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): ...
- CSU 1963 Feed the rabbit(斜率优化dp)
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1963 题意:有m个坑,每只兔子会在ti时刻回到坑中,现在有n个人,每个人都可以从任意时间(&l ...