Codechef Prime Distance On Tree
FFT第四题!
暑假的时候只会点分,然后合并是暴力合并的...水过去了...
其实两条路径长度的合并就是卷积的过程嘛,每次统计完路径就自卷积一下。
刚开始卷积固定了值域。T了。然后就不偷懒了,每次取最大权值乘二去找值域了。
#include <bits/stdc++.h> const double pi = acos(-1.0); struct Complex {
double r, i;
void clear() { r = i = 0.0; }
Complex(double r = , double i = ): r(r), i(i) {}
Complex operator + (const Complex &p) const { return Complex(r + p.r, i + p.i); }
Complex operator - (const Complex &p) const { return Complex(r - p.r, i - p.i); }
Complex operator * (const Complex &p) const { return Complex(r * p.r - i * p.i, r * p.i + i * p.r); }
}; void FFT(Complex *a, int n, int pd, int *r) {
for (int i = ; i < n; i++)
if (i < r[i])
std::swap(a[i], a[r[i]]);
for (int mid = ; mid < n; mid <<= ) {
Complex wn(cos(pi / mid), pd * sin(pi / mid));
for (int l = mid << , j = ; j < n; j += l) {
Complex w(1.0, 0.0);
for (int k = ; k < mid; k++, w = w * wn) {
Complex u = a[k + j], v = w * a[k + j + mid];
a[k + j] = u + v;
a[k + j + mid] = u - v;
}
}
}
if (pd < )
for (int i = ; i < n; i++)
a[i] = Complex(a[i].r / n, a[i].i / n);
} #define ll long long const int N = 2e5 + ;
int n, sz[N], maxsz[N], root, totsz;
std::vector<int> vec[N];
int prime[N], prin;
bool vis[N], is[N];
ll cnt[N], ccnt[N];
int dis[N], r[N];
Complex A[N];
int limit, l; void init() {
for (int i = ; i < N; i++) {
if (!is[i]) prime[++prin] = i;
for (int j = ; j <= prin && i * prime[j] < N; j++) {
is[i * prime[j]] = ;
if (i % prime[j] == ) break;
}
}
} inline bool chkmax(int &a, int b) { return a < b ? a = b, : ; } void getroot(int u, int fa) {
sz[u] = ; maxsz[u] = ;
for (int v : vec[u]) {
if (v == fa || vis[v]) continue;
getroot(v, u);
sz[u] += sz[v];
chkmax(maxsz[u], sz[v]);
}
chkmax(maxsz[u], totsz - sz[u]);
if (maxsz[u] < maxsz[root]) root = u;
} int f[N], tto, val; void getdis(int u, int fa) {
f[++tto] = dis[u];
val = std::max(val, f[tto]);
for (int v : vec[u]) {
if (vis[v] || v == fa) continue;
dis[v] = dis[u] + ;
getdis(v, u);
}
} void cal(int u, int d, int opt) {
tto = ;
dis[u] = d;
val = ;
getdis(u, );
for (int i = ; i <= tto; i++)
ccnt[f[i]]++;
limit = , l = ;
while (limit <= * val)
limit <<= , l++;
for (int i = ; i < limit; i++)
r[i] = r[i >> ] >> | ((i & ) << (l - ));
for (int i = ; i < limit; i++)
A[i] = Complex((double)ccnt[i], 0.0);
FFT(A, limit, , r);
for (int i = ; i < limit; i++)
A[i] = A[i] * A[i];
FFT(A, limit, -, r);
for (int i = ; i < limit; i++)
cnt[i] += opt * (ll)(A[i].r + 0.5);
for (int i = ; i <= tto; i++)
ccnt[f[i]]--;
} void solve(int u) {
vis[u] = ;
cal(u, , );
for (int v : vec[u]) {
if (vis[v]) continue;
cal(v, , -);
totsz = sz[v];
root = ;
getroot(v, );
solve(root);
}
} int main() {
init();
scanf("%d", &n);
for (int i = ; i < n; i++) {
int u, v;
scanf("%d%d", &u, &v);
vec[u].push_back(v);
vec[v].push_back(u);
}
maxsz[root = ] = n;
totsz = n;
getroot(, );
solve(root);
ll ans = ;
for (int i = ; i <= prin; i++) {
ans += cnt[prime[i]];
}
ll sum = 1LL * n * (n - );
printf("%.7f\n", 1.0 * ans / sum);
return ;
}
Codechef Prime Distance On Tree的更多相关文章
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- 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 ...
- 【CodeChef】Prime Distance On Tree
vjudge 给定一棵边长都是\(1\)的树,求有多少条路径长度为质数 树上路径自然是点分治去搞,但是发现要求是长度为质数,总不能对每一个质数都判断一遍吧 自然是不行的,这个东西显然是一个卷积,我们合 ...
- 数论 - 素数的运用 --- poj 2689 : Prime Distance
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12512 Accepted: 3340 D ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- UVA 10140 - Prime Distance(数论)
10140 - Prime Distance 题目链接 题意:求[l,r]区间内近期和最远的素数对. 思路:素数打表,打到sqrt(Max)就可以,然后利用大的表去筛素数.因为[l, r]最多100W ...
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- [POJ268] Prime Distance(素数筛)
/* * 二次筛素数 * POJ268----Prime Distance(数论,素数筛) */ #include<cstdio> #include<vector> using ...
随机推荐
- WinCC中通过脚本禁用或启用Windows快捷键
有些项目要求WinCC全屏运行,并禁止通过操作系统快捷键切换到桌面,这时只需要在WinCC的计算机属性中勾选“禁用用于进行操作系统访问的快捷键”.此后当WinCC运行时,按Win键或Ctrl+Alt+ ...
- MODBUS协议入门(转载)
http://blog.sina.com.cn/s/blog_65ba9a5e0101df1g.html
- LuaFramework 学习
LuaFramework_UGUI_V2 https://github.com/jarjin/LuaFramework_UGUI_V2 using UnityEngine; using LuaInte ...
- Paper | Squeeze-and-Excitation Networks
目录 1. 故事 2. SENet 2.1 概况 2.2 具体 3. 实验 本文的贡献点在于:通过显式建模特征注意力机制,达到了很好的效果.这是以往被默认隐式学习的操作.并且注意,此时建模出来的注意力 ...
- 支付宝AopSdk在dotnet core下的实现
随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移.之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framew ...
- 关于Pragma
/** This is a introduction of how to use pragma. */ #pragma once /// This is used for include the he ...
- Blazor应用程序基于角色的授权
原文:https://chrissainty.com/securing-your-blazor-apps-configuring-role-based-authorization-with-clien ...
- C# 灵活切换开发/测试/生成环境web.config
web.config <configuration> <connectionStrings configSource="config\Sit.db.config" ...
- 关于@HtmlHelper帮助器参数
@Html.ActionLink("首页", "Index", "Index", new{},new { @class = "na ...
- 最新整理的spring面试题从基础到高级,干货满满
最新整理的spring面试题从基础到高级,干货满满 前言: 收藏了一些关于Spring的面试题,一方面是为了准备找工作的时候看面试题,另一方面,通过面试题的方式加深一些自己的理论知识. spring ...