CodeChef - PRIMEDST (点分治/DSU+FFT)
CodeChef - PRIMEDST (点分治/DSU+FFT)
题目的本质是要求每种距离的点对的个数
考虑使用点分治+FFT来维护
对于当前点分根以及周围的所有点,构造\(f(x)=\sum x^{dep_x}\)求平方即可,对于每颗子树容斥
复杂度就是所有的\(Size\)之和乘上\(\log n\),即\(n\log^2 n\)
最后把距离是质数的算出来即可
(代码太丑了)
#include
using namespace std;
//#define double long double
#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)
template inline void cmin(T &a,T b){ ((a>b)&&(a=b)); }
template inline void cmax(T &a,T b){ ((a>1]>>1)|((i&1)<