最裸的点分治+fft,调了好久,太菜了。。。。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=,inf=1e9;
const double pi=acos(-);
int f[maxn],t,last[maxn],pre[maxn],other[maxn],siz[maxn],vis[maxn];
int mi,root,rev[maxn],dep,N,n,p[maxn],tot,is[maxn];
ll sum[maxn],c[maxn],cnt[maxn];
void add(int x,int y){++t;pre[t]=last[x];last[x]=t;other[t]=y;}
void getroot(int x,int fa,int ac){
f[x]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(vis[v]||v==fa)continue;
getroot(v,x,ac);
f[x]=max(f[x],siz[v]);
}
f[x]=max(siz[ac]-siz[x],f[x]);//注意这里是siz[ac]而不是n;
if(f[x]<mi){mi=f[x];root=x;}
}
void dfs(int x,int fa,int d){
c[d]++;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(vis[v]||v==fa)continue;
dfs(v,x,d+);
}
}
struct cp{
double r,i;
cp operator+(cp&t){cp tp;tp.r=r+t.r;tp.i=i+t.i;return tp;}
cp operator-(cp&t){cp tp;tp.r=r-t.r;tp.i=i-t.i;return tp;}
cp operator*(cp&t){cp tp;tp.r=r*t.r-i*t.i;tp.i=t.r*i+t.i*r;return tp;}
}A[maxn],B[maxn],tmp[maxn],wn,w,x,y;
void fft(cp a[],int n,int flag){
for(int i=;i<n;++i){
rev[i]=rev[i>>]>>;
if(i&)rev[i]|=(n>>);
}
for(int i=;i<n;++i)tmp[i]=a[rev[i]];
for(int i=;i<n;++i)a[i]=tmp[i];
for(int i=;i<=n;i<<=){
wn.r=cos(*pi/i);wn.i=flag*sin(*pi/i);
for(int j=;j<n;j+=i){
w.r=;w.i=;
for(int k=j;k<j+i/;++k){
x=a[k];y=a[k+i/]*w;
a[k]=x+y;a[k+i/]=x-y;
w=w*wn;
}
}
}
if(flag==-)for(int i=;i<n;++i)a[i].r/=n;
}
void Siz(int x,int fa){
siz[x]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(v==fa||vis[v])continue;
Siz(v,x);
siz[x]+=siz[v];
}
}
void calc(ll a[],int n,int flag){
for(int i=;i<n;++i)A[i].r=a[i],A[i].i=;
for(int i=;i<n;++i)B[i].r=a[i],B[i].i=;
fft(A,n,);
fft(B,n,);
for(int i=;i<n;++i)A[i]=A[i]*B[i];
fft(A,n,-);
for(int i=;i<n;++i)sum[i]+=flag*(ll)(A[i].r+0.3);
}
void solve(int x){
mi=1e9;
ll res=;
Siz(x,);
for(N=;N<=siz[x];N<<=);
for(int i=;i<N;++i)cnt[i]=;
cnt[]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(vis[v])continue;
for(N=;N<=*siz[v];N<<=);
for(int j=;j<N;++j)c[j]=;
dfs(v,x,);
calc(c,N,-);
for(int j=;j<N;++j)cnt[j]+=c[j];
}
for(N=;N<=siz[x];N<<=);
calc(cnt,N,);
/*for(int i=0;i<n;++i)cout<<A[i].r<<' ';
cout<<endl;*/
sum[]=;
}
void divont(int x){
mi=1e9;
Siz(x,);
getroot(x,,x);
int u=root;
//cout<<u<<endl;
solve(u);
vis[u]=;
for(int i=last[u];i;i=pre[i]){
int v=other[i];
if(!vis[v])divont(v);
}
}
int main(){
cin>>n;
int x,y;
for(int i=;i<n;++i){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
divont();
for(int i=;i<=;++i){
if(!is[i]){p[++tot]=i;}
for(int j=;j<=tot&&i*p[j]<=;++j){
is[i*p[j]]=;
if(i%p[j]==)break;
}
}
double mu=(double)n*(n-)/,res=;
for(int i=;i<=tot&&p[i]<=n;++i){
res+=sum[p[i]];
}
res/=;
printf("%.7lf",double(res)/double(mu));
return ;
}

prime distance on a tree(点分治+fft)的更多相关文章

  1. CodeChef - PRIMEDST Prime Distance On Tree 树分治 + FFT

    Prime Distance On Tree Problem description. You are given a tree. If we select 2 distinct nodes unif ...

  2. [题解] Atcoder ABC 225 H Social Distance 2 生成函数,分治FFT

    题目 首先还没有安排座位的\(m-k\)个人之间是有顺序的,所以先把答案乘上\((m-k)!\),就可以把这些人看作不可区分的. 已经确定的k个人把所有座位分成了k+1段.对于第i段,如果我们能求出这 ...

  3. bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

  4. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

  5. 数论 - 素数的运用 --- poj 2689 : Prime Distance

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12512   Accepted: 3340 D ...

  6. UVA 10140 - Prime Distance(数论)

    10140 - Prime Distance 题目链接 题意:求[l,r]区间内近期和最远的素数对. 思路:素数打表,打到sqrt(Max)就可以,然后利用大的表去筛素数.因为[l, r]最多100W ...

  7. poj 2689 Prime Distance(大区间素数)

    题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...

  8. ural1471 Distance in the Tree

    Distance in the Tree Time limit: 1.0 secondMemory limit: 64 MB A weighted tree is given. You must fi ...

  9. hdu 5730 Shell Necklace [分治fft | 多项式求逆]

    hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...

随机推荐

  1. Java框架spring 学习笔记(三):Bean 的生命周期

    当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态.当bean不再需要,并且从容器中移除时,需要做一些清除工作.为了定义安装和拆卸一个 bean,我们只要声明init-metho ...

  2. java 图片转base64字符串、base64字符串转图片

    java 图片转base64字符串.base64字符串转图片 1. 图片转base64字符串: /** * base64编码字符串转换为图片 * @param imgStr base64编码字符串 * ...

  3. Pandas透视表和交叉表

    透视表 参数名 说明 values 待聚合的列的名称.默认聚合所有数值列 index 用于分组的列名或其他分组键,出现在结果透视表的行 columns 用于分组的列表或其他分组键,出现在结果透视表的列 ...

  4. Could not HEAD 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.2.0/gradle-3.2.0.pom'.

  5. docker制作镜像

    使用Dockerfile脚本创建jdk1.8镜像 新建jdk目录:(-p表示需要父目录,不然就会出错) mkdir -p /usr/local/dockerjdk1. 将jdk的压缩文件复制到上面的路 ...

  6. formValidator 插件 使用总结

    1. 大小写的问题, formvalidator 的属性 大小写问题一定要注意, 在踩过的坑里就包括这个, 把所有属性的第二个字母的开头全部写成大写 ,导致提示信息不能用,这个问题纠结了好久 2.er ...

  7. Spring常用注解总结(1)

    前言:项目中常用的注解常看常记,总会对自己有些好处,所以在这里分享一下. 使用spring时,可以使用xml配置文件配置相关信息.但是我还是喜欢用注解的方式,因为可以充分利用反射机制获取类结构信息,而 ...

  8. Linux静态设置CentOS 7虚拟机的IP

    进入root ,输入命令:# vi /etc/sysconfig/network-scripts/ifcfg-ens33 .将DHCP协议获取IP,改为static静态,加上想要设置的IPADDR即可 ...

  9. github ignore 规范

    转自:https://www.cnblogs.com/xuld gitignore 应该包含 5 块内容: 当前项目需要忽略的文件 项目性质需要忽略的文件(比如是 nodejs 项目,有些文件就需要忽 ...

  10. php + mysql 存入表情 【如何转义emoji表情,让它可以存入utf8的数据库】

    方法1:base_encode64 这种方法是可以,但是旧数据没有经过encode操作,取数据的时候如果统一进行decode的话,旧数据会丢失的. 1 方法2:urlencode 这个似乎可以,对没有 ...