Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.79 KB | None | 0 0
  1. // main.cpp
  2. // solve
  3. //
  4. // Created by Ahmed on 11/16/16.
  5. // Copyright © 2016 Abdellah. All rights reserved.
  6. //
  7.  
  8.  
  9. #include<set>
  10. #include<map>
  11. #include <unordered_map>
  12. #include <unordered_set>
  13. #include<list>
  14. #include<iomanip>
  15. #include<cmath>
  16. #include<string>
  17. #include<vector>
  18. #include<queue>
  19. #include<stack>
  20. #include<complex>
  21. #include<sstream>
  22. #include<iostream>
  23. #include<fstream>
  24. #include<algorithm>
  25. #include<numeric>
  26. #include<utility>
  27. #include<functional>
  28. #include<stdio.h>
  29. #include<assert.h>
  30. #include<memory.h>
  31. #include<bitset>
  32. #include<math.h>
  33. #include <strings.h>
  34.  
  35.  
  36.  
  37. #define f first
  38. #define s second
  39. #define pb push_back
  40. #define sz(a) (int)(a).size()
  41. #define lp(i,a,n) for(int (i)=(a);(i)<=(int)(n);(i)++)
  42. #define lpd(i,n,a) for(int (i)=(n);(i)>=(a);--(i))
  43. #define mp make_pair
  44. #define clr(a,b) memset(a,b,sizeof a)
  45. #define all(v) (v).begin(),(v).end()
  46. #define mod 1000000007
  47. #define eps 1e-6
  48. #define infi 1000000002
  49. #define infll 4000000000000000005ll
  50. #define MX 1000000
  51. #define X real()
  52. #define Y imag()
  53. #define polar(r,t) ((r)* exp(point(0,(t))))
  54. #define length(a) hypot( (a).X , (a).Y )
  55. #define angle(a) atan2( (a).Y , (a).X )
  56. #define vec(a,b) ( (b) - (a) )
  57. #define dot(a,b) (conj(a)*(b)).X
  58. #define cross(a,b) (conj(a)*(b)).Y
  59. #define lengthsqr(a) dot(a,a)
  60. #define reflect(V,M) (conj((V)/(M)) * (M))
  61. #define normalize(a) ((a)/length(a))
  62. #define ccw(a,b,c) cross(vec(a,b) , vec(a,c)) > -eps
  63. #define cosRule(a,b,c) (acos(((a)*(a)+(b)*(b)-(c)*(c))/(2*(a)*(b))))
  64. #define cosDot(a,b) (acos(dot(a,b)/length(a)/length(b)))
  65. #define EQ(a,b) (fabs((a) - (b)) <= eps) /* equal to */
  66. #define NE(a,b) (fabs((a) - (b)) > eps) /* not equal to */
  67. #define LT(a,b) ((a) < (b) - eps) /* less than */
  68. #define GT(a,b) ((a) > (b) + eps) /* greater than */
  69. #define LE(a,b) ((a) <= (b) + eps) /* less than or equal to */
  70. #define GE(a,b) ((a) >= (b) - eps) /* greater than or equal to */
  71. #define mod1 100050001
  72. #define mod2 100030001
  73. #define base1 37
  74. #define base2 31
  75. #define que priority_queue<pair<int,int>, vector<pair<int,int>> , greater<pair<int,int> > >
  76. #define rotate(v,t) ((v)*exp(point(0,t)))
  77. #define rotateabout(v,t,a) (rotate(vec(a,v),t)+(a))
  78. #define PI atan(1)*4
  79.  
  80.  
  81. using namespace std;
  82. typedef long long ll;
  83. typedef pair<int, int> pii;
  84. typedef pair<double,double> pdd;
  85. typedef pair<ll, ll> pll;
  86. typedef vector<int> vi;
  87. typedef vector<ll> vll;
  88. typedef vector<vi> vvi;
  89. typedef set<int> si;
  90. typedef map<int, int> mii;
  91. typedef map<ll, ll> mll;
  92. typedef unordered_map<ll, ll> umll;
  93. typedef complex<long double> point;
  94. typedef pair<point, point> line;
  95. typedef pair<double , point> Circle;
  96.  
  97.  
  98. const int N = 50002;
  99.  
  100. vi tree[N], centroidTree[N];
  101. bool centroidMarked[N], vis[N], color[N];
  102. int n,m,siz[N], centroidParent[N];
  103.  
  104.  
  105.  
  106. void DFS(int node, int* n)
  107. {
  108.  
  109. vis[node] = true;
  110. *n += 1;
  111. siz[node] = 1;
  112.  
  113. for(int ch:tree[node])
  114. if (!vis[ch] && !centroidMarked[ch])
  115. {
  116. DFS(ch, n);
  117. siz[node]+=siz[ch];
  118. }
  119. }
  120.  
  121. int getCentroid(int node, int n)
  122. {
  123. bool is_centroid = true;
  124.  
  125. vis[node] = true;
  126.  
  127. int heaviest_child = 0;
  128.  
  129. for(int ch:tree[node])
  130. if (!vis[ch] && !centroidMarked[ch])
  131. {
  132.  
  133. if (siz[ch]>n/2)
  134. is_centroid=false;
  135.  
  136.  
  137. if (heaviest_child==0 || siz[ch]>siz[heaviest_child])
  138. heaviest_child = ch;
  139. }
  140.  
  141.  
  142. if (is_centroid && n-siz[node]<=n/2)
  143. return node;
  144.  
  145.  
  146. return getCentroid(heaviest_child, n);
  147. }
  148.  
  149.  
  150. int getCentroid(int src)
  151. {
  152.  
  153. clr(siz,0), clr(vis, false);
  154.  
  155. int n = 0;
  156.  
  157. DFS(src, &n);
  158.  
  159. clr(vis, false);
  160.  
  161. int centroid = getCentroid(src, n);
  162.  
  163. centroidMarked[centroid]=true;
  164.  
  165. return centroid;
  166. }
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173. int decomposeTree(int root)
  174. {
  175.  
  176. int cend_tree = getCentroid(root);
  177.  
  178.  
  179. // printf("%d ", cend_tree);
  180.  
  181.  
  182. for(int ch:tree[cend_tree])
  183. {
  184. if (!centroidMarked[ch])
  185. {
  186.  
  187. int cend_subtree = decomposeTree(ch);
  188.  
  189.  
  190. centroidTree[cend_tree].push_back(cend_subtree);
  191. centroidTree[cend_subtree].push_back(cend_tree);
  192.  
  193. centroidParent[cend_subtree] = cend_tree;
  194. }
  195. }
  196.  
  197.  
  198. return cend_tree;
  199. }
  200.  
  201.  
  202. int eTour[2*N][22],sTime[N],inv[2*N],level[N],lg[2*N],elen;
  203.  
  204.  
  205. void dfs(int node,int p,int depth) {
  206. sTime[node] = ++elen;
  207. inv[elen] = node;
  208. eTour[elen][0] = sTime[node];
  209. level[node] = depth;
  210. for(int ch:tree[node])
  211. if(ch != p) dfs(ch, node,depth+1), eTour[++elen][0] = sTime[node], inv[elen] = node;
  212. }
  213.  
  214. void build() {
  215.  
  216. for(int i=0;(1<<i) <= 2*n ; ++i) lg[1<<i] = i;
  217.  
  218. lp(i, 1, 2*n-1) if(!lg[i]) lg[i] = lg[i-1];
  219.  
  220. lp(i, 0, 2*n) lp(j, 0, 20) eTour[i][j] = infi;
  221.  
  222. dfs(1, -1,1);
  223.  
  224. for(int j=1; (1<<j) <= elen ; ++j) lp(i, 1, elen) if(i+(1<<j)-1 <= elen)
  225. eTour[i][j] = min(eTour[i][j-1], eTour[i+(1<<(j-1))][j-1]);
  226. }
  227.  
  228.  
  229. int LCA(int p,int q) {
  230. if(sTime[p] > sTime[q]) swap(q, p);
  231. int l = sTime[p], r = sTime[q];
  232. int shift = lg[r - l + 1];
  233. return inv[min(eTour[l][shift], eTour[r-(1<<shift)+1][shift])];
  234. }
  235.  
  236.  
  237. int dist(int u,int v) {
  238. return level[u] + level[v] - 2*level[LCA(u, v)];
  239. }
  240.  
  241.  
  242. vi primes;
  243. void init () {
  244. vector<bool> isPrime(N, true);
  245.  
  246. isPrime[0] = isPrime[1] = false;
  247. lp(i, 2, N-1) if(isPrime[i]) {
  248. primes.pb(i);
  249. for(ll j = 1ll*i*i ; j < N ; j += i)
  250. isPrime[j] = false;
  251. }
  252. }
  253.  
  254.  
  255. unordered_map<int, int> dists[N];
  256. void calc_dists() {
  257. lp(i, 1, n) {
  258. int p = i;
  259. while (p != -1) ++dists[p][dist(i, p)] , p = centroidParent[p];
  260. }
  261. }
  262.  
  263. ll solve() {
  264. ll ret = 0;
  265. lp(i, 1, n) {
  266. int par = i, prev = -1;
  267. while (par != -1) {
  268. int d = dist(i, par);
  269. for(int p:primes) if(dists[par].count(p-d)) {
  270. ret += dists[par][p-d];
  271. if(prev != -1 && dists[prev].count(p-d-1))
  272. ret -= dists[prev][p-d-1];
  273. }
  274.  
  275. prev = par;
  276. par = centroidParent[par];
  277. }
  278. }
  279. return ret;
  280. }
  281.  
  282.  
  283. int main() {
  284. scanf("%d",&n);
  285. lp(i, 2, n) {
  286. int a,b;
  287. scanf("%d%d",&a,&b);
  288. tree[a].pb(b) , tree[b].pb(a);
  289. }
  290.  
  291.  
  292. build() , init();
  293. clr(centroidParent, -1);
  294. decomposeTree(1);
  295. calc_dists();
  296.  
  297.  
  298. long double ans = solve();
  299. ans /= n, ans /= (n-1);
  300.  
  301.  
  302. printf("%Lf\n",ans);
  303. return 0;
  304. }
  305.  
  306.  
  307. /*
  308. 4
  309. 1 2
  310. 2 3
  311. 2 4
  312.  
  313.  
  314.  
  315. */
  316.  
  317. //freopen("output.txt","w",stdout);
  318. //freopen("input.txt","r",stdin);
  319. //ios::sync_with_stdio(0);cin.tie(0);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement