2018.11.17 codechef PRIMEDST(点分治+fft)
传送门
fftfftfft一眼题(其实最先想到的是nttnttntt,wawawa了几次之后发现模数不够大果断弃疗写fftfftfft)
我们点分治统计答案的个数。
考虑现在已经统计出了到当前点的所有距离如何更新答案。
显然如果两个距离能够凑出一个质数的话就对答案有1的贡献。
所以相当于计算出每一个距离的个数。
然后可以推一个式子:
tota=∑i=0maxdiscnti∗cnta−itot_a=\sum_{i=0}^{maxdis}cnt_i*cnt_{a-i}tota=∑i=0maxdiscnti∗cnta−i
这不就是距离数组跟自己卷积吗?
果断fftfftfft优化。
然而fftfftfft的写法也wawawa了。
找dzyodzyodzyo拍了半天没错?
然后全局longlonglong longlonglong了一波终于过了233.
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
const double pi=acos(-1.0);
const int N=2e5+5;
int n,pri[N],tot=0,msiz[N],siz[N],vis[N],rt,all,tmp[N],lim=1,tim=0,pos[N],maxn;
bool isp[N];
vector<int>e[N>>2];
ll ans=0;
inline void init(){
isp[1]=1;
for(register int i=2;i<=n;++i){
if(!isp[i])pri[++tot]=i;
for(register int j=1;j<=tot&&i*pri[j]<=n;++j){
isp[i*pri[j]]=1;
if(i%pri[j]==0)break;
}
}
}
struct Complex{
double x,y;
friend inline Complex operator+(const Complex&a,const Complex&b){return (Complex){a.x+b.x,a.y+b.y};}
friend inline Complex operator-(const Complex&a,const Complex&b){return (Complex){a.x-b.x,a.y-b.y};}
friend inline Complex operator*(const Complex&a,const Complex&b){return (Complex){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
friend inline Complex operator/(const Complex&a,const double&b){return (Complex){a.x/b,a.y/b};}
}cnt[N];
inline void fft(Complex a[],int type){
for(register int i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
for(register int mid=1;mid<lim;mid<<=1){
Complex wn=(Complex){cos(pi/mid),sin(type*pi/mid)};
for(register int j=0,len=mid<<1;j<lim;j+=len){
Complex w=(Complex){1,0};
for(register int k=0;k<mid;++k,w=w*wn){
Complex a0=a[j+k],a1=a[j+k+mid]*w;
a[j+k]=a0+a1,a[j+k+mid]=a0-a1;
}
}
}
if(type==-1)for(register int i=0;i<lim;++i)a[i]=a[i]/(double)lim;
}
void getroot(int p,int fa){
msiz[p]=siz[p]=1;
for(register int i=0;i<e[p].size();++i){
int v=e[p][i];
if(v==fa||vis[v])continue;
getroot(v,p),siz[p]+=siz[v],msiz[p]=max(msiz[p],siz[v]);
}
msiz[p]=max(msiz[p],all-siz[p]);
if(msiz[p]<msiz[rt])rt=p;
}
void getdis(int p,int fa,int delt){
cnt[delt].x+=1;
maxn=max(maxn,delt);
for(register int i=0;i<e[p].size();++i){
int v=e[p][i];
if(vis[v]||v==fa)continue;
getdis(v,p,delt+1);
}
}
inline void calc(int p,int delt,int type){
maxn=0,getdis(p,0,delt),lim=1,tim=0;
while(lim<=maxn*2)++tim,lim<<=1;
for(register int i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
int sum=(int)-cnt[1].x;
fft(cnt,1);
for(register int i=0;i<lim;++i)cnt[i]=cnt[i]*cnt[i];
fft(cnt,-1);
for(register int i=1;i<=tot;++i){
if(pri[i]>lim)break;
sum+=(int)(cnt[pri[i]].x+0.5);
}
ans+=(ll)sum/2*type;
for(register int i=0;i<lim;++i)cnt[i].x=cnt[i].y=0;
}
void solve(int p){
calc(p,0,1),vis[p]=1;
for(register int i=0;i<e[p].size();++i){
int v=e[p][i];
if(vis[v])continue;
all=siz[v],rt=0,calc(v,1,-1),getroot(v,0),solve(rt);
}
}
signed main(){
freopen("lx.in","r",stdin);
n=read(),init();
for(register int i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
all=msiz[rt=0]=n,getroot(1,0),solve(rt);
printf("%.8lf",(double)ans*2.0/(double)((double)n*(double)(n-1)));
return 0;
}
2018.11.17 codechef PRIMEDST(点分治+fft)的更多相关文章
- International Programming Retreat Day(2018.11.17)
时间:2018.11.17地点:北京国华投资大厦
- 2018.11.17 bzoj4259: 残缺的字符串(fft)
传送门 fftfftfft套路题. 我们把aaa ~ zzz映射成111 ~ 262626,然后把∗*∗映射成000. 考虑对于两个长度都为nnn的字符串A,BA,BA,B. 我们定义一个差异函数di ...
- IOS面试题2018/11/17
1.设计模式是什么?你知道哪些设计模式? 设计模式是一种编码经验,就是一种成熟的逻辑去处理某一种类型的事情. 1.MVC模式:model view controller,把模型,视图,控制器 层进行解 ...
- 2018.11.17 hdu5829Rikka with Subset(ntt)
传送门 nttnttntt基础题. 考虑计算每一个数在排名为kkk时被统计了多少次来更新答案. 这样的话,设anskans_kansk表示所有数的值乘上排名为kkk的子集数的总和. 则ansk=∑i ...
- Django学习笔记-2018.11.17
URL配置: 项目下的urls.py配置的为URL总路径,在使用第二种方法在app下配置的urls.py是在总路径下的分路径 Templates: DTL初步使用 render()函数支持dict类型 ...
- 2018.11.17 Struts2框架入门
Struts2 框架学习 一.struts2是什么? (1)概念 (2)struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 (3)st ...
- 2017 3 11 分治FFT
考试一道题的递推式为$$f[i]=\sum_{j=1}^{i} j^k \times (i-1)! \times \frac{f[i-j]}{(i-j)!}$$这显然是一个卷积的形式,但$f$需要由自 ...
- hdu 5730 Shell Necklace [分治fft | 多项式求逆]
hdu 5730 Shell Necklace 题意:求递推式\(f_n = \sum_{i=1}^n a_i f_{n-i}\),模313 多么优秀的模板题 可以用分治fft,也可以多项式求逆 分治 ...
- 洛谷 P4721 【模板】分治 FFT 解题报告
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...
随机推荐
- Selenium 定位元素原理,基本API,显示等待,隐式等待,重试机制等等
Selenium 如何定位动态元素: 测试的时候会遇到元素每次变动的情况,例如: <div id="btn-attention_2030295">...</di ...
- PHP中的变量与PHP中算false的情况
一PHP中的变量 1.PHP中的变量,声明与使用必须用$开头 2.PHP是一种弱类型语言,变量其实并不需要声明.可以直接给变量赋任何类型的值: 3.PHP中可以使用连等同时声明多个变量, eg:num ...
- Camera插件推荐,解锁电影大师级视角控制
相机在游戏中的重要性是不言而喻的,尤其是一些MMORPG或FPS等类型的游戏,相机不仅需要跟随游戏主角进行移动,可能还要随时准备切换焦点,这就要求开发者将游戏相机管理得井井有条,能顺应游戏中可能瞬息发 ...
- socket、fsockopen、curl、stream 区别
socket 水泥.沙子,底层的东西fsockopen 水泥预制件,可以用来搭房子curl 毛坯房,自己装修一下就能住了 水泥.沙子不但可以修房子,还能修路.修桥.大型雕塑.socket也是,不但可以 ...
- 克隆后没有IP
删除文件: /etc/udev/rules.d/70-persistent-net.rules 将/etc/sysconfig/network-scripts/ifcfg-eth0 中的HWADDR ...
- sqlserver数据库的物理存储格式和逻辑存储格式
物理存储结构: 数据库文件在磁盘上的存储形式: 主数据文件:*.mdf.用来存储数据库的启动信息.存储部分或全部的数据.整个的数据库只能有一个主数据文件 辅助数据文件:*.ndf.用于存储主数据文件未 ...
- 【gRPC使用问题1】gRPC的proto内import其他proto导致的一次小坑
1.对于一些proto里面的定义,如果包含了 引入其他proto文件的 proto文件来说,生成的时候要注意.尤其是 引入的是官方框架内的 proto文件,如果自己没有提供的话,生成代码会报错! 具体 ...
- dev accordionControl panelcontorl 使用
对于dev的窗体布局我想更系统的专业的学学,不是评自己以往 的经验去做, 所以我看了dev的demo 里边的例子,封装的很严实,还有他们自己重新做的控件,无法直接使用, 关键的控件也上了锁,可能也是保 ...
- 织梦替换百度编辑器后栏目内容、单页无法保存bug修复
找了一些教程是错的,这个测试过是正确的. 修改后台文件dede>templets>catalog_add.htm和catalog_edit.htm 一.在catalog_add.htm大概 ...
- C# oracle 日期型字段,使用参数传值时,遇到ORA-01810: format code appears twice错误
C#操作oracle数据库时,发现使用to_date('2014-01-03 18:00:00','yyyy-mm-dd hh:MM:ss')时,会出现ORA-01810: format code a ...