最裸的点分治+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. C语言典型编程1

    关于C的一些小而精的编程,适合希望提升编程能力的初学者学习:关键编程也就几句,但思维可以迁移到其他编程语言.同一问题,算法多种 //阶乘运算(有多种编写方式,编程需要看懂,更要打出来)#include ...

  2. paloalto防火墙内存使用率高

    上述内存使用率是正常的,实际使用的是buffers.

  3. Python学习笔记十_模块、第三方模块安装、模块导入

    一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...

  4. 关于element-ui resetFields

    上周换到新项目组,依然是vue,不过是搭配element-ui. 这两天开始用el-form,发现了个问题. 就是我的表单确定提交之后,需要重置表单,一开始我没看熟API,直接将form对象手动赋成初 ...

  5. typename的用法

    template <class T> void foo() { typename T::iterator * iter; } class ContainsAType{ public: cl ...

  6. Tomcat start.bat闪退:JRE_HOME环境变量配置不对

    最近在配置Tomcat上遇到startup.bat启动闪退,在网上找了很多方法,都没解决.后来在网上找到两种问题,更改了两次,解决了.现将我遇到的问题分享,希望对遇到同样问题有帮助. 1.很多初学者对 ...

  7. mysql 多列索引学习-经典实例

    索引优化 ,b-tree假设某个表有一个联合索引(c1,c2,c3,c4) 以下 只能使用该联合索引的c1,c2,c3部分A. where c1 = x and c2 = x and c4>x ...

  8. redis集群搭建及设置账户(转)

    Redis集群搭建以及为集群设置密码 介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. ...

  9. WPF中的数据绑定(初级)

    关于WPF中的数据绑定,初步探讨 数据绑定属于WPF中比较核心的范畴,以下是对WPF中数据绑定的一个初步探讨.个人感觉还是带有问题性质的叙述比较高效,也比较容易懂 第一,什么是数据绑定? 假定有这么一 ...

  10. strcat的用法

    原型: char *strcat(char *str1,char *str2); strcat的实现: char* MyStrcat(char *dst, const char*src) { if ( ...