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

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. const int maxn=,inf=1e9;
  9. const double pi=acos(-);
  10. int f[maxn],t,last[maxn],pre[maxn],other[maxn],siz[maxn],vis[maxn];
  11. int mi,root,rev[maxn],dep,N,n,p[maxn],tot,is[maxn];
  12. ll sum[maxn],c[maxn],cnt[maxn];
  13. void add(int x,int y){++t;pre[t]=last[x];last[x]=t;other[t]=y;}
  14. void getroot(int x,int fa,int ac){
  15. f[x]=;
  16. for(int i=last[x];i;i=pre[i]){
  17. int v=other[i];
  18. if(vis[v]||v==fa)continue;
  19. getroot(v,x,ac);
  20. f[x]=max(f[x],siz[v]);
  21. }
  22. f[x]=max(siz[ac]-siz[x],f[x]);//注意这里是siz[ac]而不是n;
  23. if(f[x]<mi){mi=f[x];root=x;}
  24. }
  25. void dfs(int x,int fa,int d){
  26. c[d]++;
  27. for(int i=last[x];i;i=pre[i]){
  28. int v=other[i];
  29. if(vis[v]||v==fa)continue;
  30. dfs(v,x,d+);
  31. }
  32. }
  33. struct cp{
  34. double r,i;
  35. cp operator+(cp&t){cp tp;tp.r=r+t.r;tp.i=i+t.i;return tp;}
  36. cp operator-(cp&t){cp tp;tp.r=r-t.r;tp.i=i-t.i;return tp;}
  37. cp operator*(cp&t){cp tp;tp.r=r*t.r-i*t.i;tp.i=t.r*i+t.i*r;return tp;}
  38. }A[maxn],B[maxn],tmp[maxn],wn,w,x,y;
  39. void fft(cp a[],int n,int flag){
  40. for(int i=;i<n;++i){
  41. rev[i]=rev[i>>]>>;
  42. if(i&)rev[i]|=(n>>);
  43. }
  44. for(int i=;i<n;++i)tmp[i]=a[rev[i]];
  45. for(int i=;i<n;++i)a[i]=tmp[i];
  46. for(int i=;i<=n;i<<=){
  47. wn.r=cos(*pi/i);wn.i=flag*sin(*pi/i);
  48. for(int j=;j<n;j+=i){
  49. w.r=;w.i=;
  50. for(int k=j;k<j+i/;++k){
  51. x=a[k];y=a[k+i/]*w;
  52. a[k]=x+y;a[k+i/]=x-y;
  53. w=w*wn;
  54. }
  55. }
  56. }
  57. if(flag==-)for(int i=;i<n;++i)a[i].r/=n;
  58. }
  59. void Siz(int x,int fa){
  60. siz[x]=;
  61. for(int i=last[x];i;i=pre[i]){
  62. int v=other[i];
  63. if(v==fa||vis[v])continue;
  64. Siz(v,x);
  65. siz[x]+=siz[v];
  66. }
  67. }
  68. void calc(ll a[],int n,int flag){
  69. for(int i=;i<n;++i)A[i].r=a[i],A[i].i=;
  70. for(int i=;i<n;++i)B[i].r=a[i],B[i].i=;
  71. fft(A,n,);
  72. fft(B,n,);
  73. for(int i=;i<n;++i)A[i]=A[i]*B[i];
  74. fft(A,n,-);
  75. for(int i=;i<n;++i)sum[i]+=flag*(ll)(A[i].r+0.3);
  76. }
  77. void solve(int x){
  78. mi=1e9;
  79. ll res=;
  80. Siz(x,);
  81. for(N=;N<=siz[x];N<<=);
  82. for(int i=;i<N;++i)cnt[i]=;
  83. cnt[]=;
  84. for(int i=last[x];i;i=pre[i]){
  85. int v=other[i];
  86. if(vis[v])continue;
  87. for(N=;N<=*siz[v];N<<=);
  88. for(int j=;j<N;++j)c[j]=;
  89. dfs(v,x,);
  90. calc(c,N,-);
  91. for(int j=;j<N;++j)cnt[j]+=c[j];
  92. }
  93. for(N=;N<=siz[x];N<<=);
  94. calc(cnt,N,);
  95. /*for(int i=0;i<n;++i)cout<<A[i].r<<' ';
  96. cout<<endl;*/
  97. sum[]=;
  98. }
  99. void divont(int x){
  100. mi=1e9;
  101. Siz(x,);
  102. getroot(x,,x);
  103. int u=root;
  104. //cout<<u<<endl;
  105. solve(u);
  106. vis[u]=;
  107. for(int i=last[u];i;i=pre[i]){
  108. int v=other[i];
  109. if(!vis[v])divont(v);
  110. }
  111. }
  112. int main(){
  113. cin>>n;
  114. int x,y;
  115. for(int i=;i<n;++i){
  116. scanf("%d%d",&x,&y);
  117. add(x,y);add(y,x);
  118. }
  119. divont();
  120. for(int i=;i<=;++i){
  121. if(!is[i]){p[++tot]=i;}
  122. for(int j=;j<=tot&&i*p[j]<=;++j){
  123. is[i*p[j]]=;
  124. if(i%p[j]==)break;
  125. }
  126. }
  127. double mu=(double)n*(n-)/,res=;
  128. for(int i=;i<=tot&&p[i]<=n;++i){
  129. res+=sum[p[i]];
  130. }
  131. res/=;
  132. printf("%.7lf",double(res)/double(mu));
  133. return ;
  134. }

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. 什么是云?Iaas,Paas和SaaS

    周围的朋友听说我是做云相关的,总是爱问啥是云?别不是虚幻的概念吧.云计算当然不是虚幻的概念,“云”其实是互联网的一个隐喻,简单地说,云计算是通过Internet(“云”)交付计算服务——服务器.存储. ...

  2. PhoenixFD插件流体模拟——UI布局【Interaction】详解

    流体交互 本文主要讲解Interaction折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Interaction 主要 ...

  3. TZOJ 2569 Wooden Fence(凸包求周长)

    描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...

  4. 2018-2019-2 20165315 《网络对抗技术》Exp4 恶意代码分析

    2018-2019-2 20165315 <网络对抗技术>Exp4 恶意代码分析 一.实验要求 1.系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是 ...

  5. 笔记之monkey自定义脚本

    自定义脚本的稳定性测试 常规MOnkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景者时候就需要用到自定义脚本,Monkey支持执行用户自定义脚本的测试,用户之需要按照Monk ...

  6. C# Task.Run 和 Task.Factory.StartNew 区别

    Task.Run 是在 dotnet framework 4.5 之后才可以使用,但是 Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制.可以认 ...

  7. 010 Editor 8.0.1 之 逆向分析及注册机编写

    前言一.工具及软件介绍二.逆向分析2.1.找到提示错误注册弹窗2.2.分析跳转处代码2.3.=2D 函数分析2.3.1.获取注册码处分析2.3.2.3处分支分析2.3.2.1.9C情况2.3.2.2. ...

  8. 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)

    本文转自https://my.oschina.net/u/1866821/blog/297673 索引的重要性数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义. ...

  9. Lonsdor K518ISE programs 2005 Ford Focus key in two minutes

    A quick demonstration of Lonsdor K518ISE programming key for 2005 Ford Focus in two minutes. And for ...

  10. appnium启动报错Encountered internal error running command: Error: Error occured while starting App. Original error: Permission to start activity denied.

    说明写错了activity 首先查看一下activity,使用命令 打开被测app,输入命令adb shell dumpsys window | findstr mCurrentFocus 看似这个a ...