2019.03.29 NOIP训练 友好国度(点分治+容斥)

传送门
思路:
直接上点分治+容斥计算每个因数对应的贡献即可。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
typedef long long ll;
const int N=1e5+5;
vector<int>e[N],fac[N],coe[N];
int n,a[N],lim=0,all,mx,siz[N],rt,Tim[N],cnt[N],mul[N],tim=0;
bool vis[N],chk[N];
ll ans=0;
inline int get(int x){if(mul[x])return mul[x];if(x<2)return mul[x]=x;int ret=1;for(ri i=0;i<fac[x].size();++i)ret*=fac[x][i];return mul[x]=ret;
}
inline void get_coef(int pos,int mul,int a){if(pos==fac[a].size()){if(~mul)coe[a].push_back(mul);return;}get_coef(pos+1,mul,a);get_coef(pos+1,-fac[a][pos]*mul,a);
}
inline void init(){for(ri i=2;i<=lim;++i)if(!vis[i])for(ri j=i;j<=lim;j+=i)vis[j]=1,fac[j].push_back(i);for(ri i=1,x;i<=n;++i)vis[i]=0,a[i]=get(a[i]);
}
void getroot(int p,int fa){siz[p]=1;int ms=0;for(ri i=0,v;i<e[p].size();++i){if((v=e[p][i])==fa||vis[v])continue;getroot(v,p),siz[p]+=siz[v],ms=max(ms,siz[v]);}ms=max(ms,all-siz[p]);if(ms<=mx)rt=p,mx=ms;
}
inline int query(int x){return Tim[x]==tim?cnt[x]:0;}
inline int ask(int x){int ret=0;if(!chk[x])get_coef(0,-1,x),chk[x]=1;for(ri i=0;i<coe[x].size();++i)ret+=coe[x][i]/abs(coe[x][i])*query(abs(coe[x][i]));return ret;
}
inline void update(int x){Tim[x]==tim?++cnt[x]:cnt[x]=1,Tim[x]=tim;}
inline void change(int x){if(!chk[x])get_coef(0,-1,x),chk[x]=1;for(ri i=0;i<coe[x].size();++i)update(abs(coe[x][i]));
}
inline int gcd(int a,int b){int t;while(b){t=a,a=b,b=t-t/a*a;}return a;}
void dfs(int p,int fa,int g,int coef){g=gcd(g,a[p]),ans+=coef*ask(g),change(g),siz[p]=1;for(ri i=0,v;i<e[p].size();++i){if(vis[v=e[p][i]]||v==fa)continue;dfs(v,p,g,coef),siz[p]+=siz[v];}
}
inline void solve(int p){vis[p]=1;++tim;change(a[p]);for(ri i=0,v;i<e[p].size();++i)if(!vis[v=e[p][i]])dfs(v,p,a[p],1);for(ri i=0,v;i<e[p].size();++i){if(vis[v=e[p][i]])continue;++tim,dfs(v,p,a[p],-1),mx=all=siz[v],getroot(v,p),solve(rt);}
}
int main(){n=read();for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);for(ri i=1;i<=n;++i)a[i]=read(),lim=max(lim,a[i]);init();rt=0,mx=all=n,getroot(1,0),solve(rt);cout<<(ll)n*(n-1)/2-ans;return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10633597.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cocos2d-x 3.2 异步动态加载 -- 保卫萝卜开发总结

from http://cn.cocos2d-x.org/tutorial/show?id1277本章只分享一下异步加载的逻辑&#xff0c;如有不对的地方还望大家及时指出。目前我代码中需要异步加载的资源一共有四类&#xff1a;1.png&#xff0c;单个png的情况比较少2.plist和png一起的打包资源3.plist和pvr.ccz一起…

CISSP的成长之路(九):复习信息安全管理(3)

上一篇文章《复习信息安全治理&#xff08;2&#xff09;》里&#xff0c;J0ker给大家简单介绍了风险分析和评估的一些要点。我们都知道&#xff0c;假如同时做多个事情&#xff0c;就需要按照事情的轻重缓急来安排好执行的顺序和投入&#xff0c;实施信息安全项目时也必须如此…

linux硬盘检测工具,CrazyDiskInfo 硬盘检测工具 Linux版 | 厘米天空

之前本站介绍过CrystalDiskInfo这款windows下的硬盘检测工具&#xff0c;今天来看看Linux下的版本CrazyDiskInfo。CrazyDiskInfo是一款用于Unix类系统的交互式TUI S.M.A.R.T查看器&#xff0c;可以查看硬盘健康情况&#xff0c;是否有坏扇区等。项目地址&#xff1a;https://gi…

PHP中this,self,parent的区别

一、 PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程&#xff0c;对于提高PHP编程能力和规划web开发构架都是很有意义的。 PHP5经过重写后&#xff0c;对OOP的支持额有…

ListView下拉刷新、上拉载入更多之封装改进

在Android中ListView下拉刷新、上拉载入更多示例一文中&#xff0c;Maxwin兄给出的控件比较强大&#xff0c;前面有详细介绍&#xff0c;但是有个不足就是&#xff0c;里面使用了一些资源文件&#xff0c;包括图片&#xff0c;String&#xff0c;layout&#xff0c;这样不利于封…

Refactoring Connection To Sql

您的程序不必登录设计一个库&#xff0c;注册设计一个库&#xff0c;一个站点设计一个库即可。您的连接数据库的字符串有写错&#xff0c;另外建议不要用中文来命名站点名或是网页名称。 Refactoring之后做法如下&#xff1a; 文件格式&#xff1a;.wmv&#xff1b;大小&#x…

linux 远程图形终端,图形终端远程操作Linux

一、想要在远程终端运用图形界面来操作和控制Linux效劳器&#xff0c;就在windows下像运用MSTSC(远程桌面)一样。linux经过XDMCP来提供这种支持&#xff0c;我们只需用一个终端仿真软件&#xff1a;xmanager&#xff0c;但是装完Xmanager后是不能直接远程衔接Linux效劳器的Xwin…

windows下nginx的安装及使用

1.下载nginx http://nginx.org/en/download.html 下载稳定版本&#xff0c;以nginx/Windows-1.12.2为例&#xff0c;直接下载 nginx-1.12.2.zip 下载后解压&#xff0c;解压后如下 2.启动nginx 有很多种方法启动nginx (1)直接双击nginx.exe&#xff0c;双击后一个黑色的…

win8.1出现 called runscript when not marked in progress

1.打开任务管理器-详细信息-结束图片中选择的进程 2.然后在任务管理器左上角“文件“>运行新任务&#xff1a; 输入C:\\Windows\explorer.exe&#xff0c;并勾选”以系统管理权限创建此任务“&#xff0c;点击确定&#xff1a; 3.这样就可以继续安装了。 转载于:https://www…

学游泳

今天上午又去了人大附中&#xff0c;门紧锁着&#xff0c;去正门一问才知道&#xff0c;要周末下午1点30才开门&#xff0c;平时是5点30。回家吧&#xff0c;外面居然下起了星星点点的小雪&#xff0c;北京的三月…… 学蛙泳 老旱四诀之蛙泳 分手压腕, 双锚拉纤, 高肘抱水, 翻…

Linux中内联函数,Windows 7上的内联函数的doParallel问题(适用于Linux)

我在Windows 7和Linux(SUSE Server 11(x86_64))上都使用R 3.0.1.以下示例代码在Windows上产生错误,但在Linux上不产生错误.列出的所有工具箱在两台机器中都是最新的.Windows错误是&#xff1a;Error in { : task 1 failed - "NULL value passed as symbol address"如…

Content-Disposition 响应头,设置文件在浏览器打开还是下载

Content-Disposition属性有两种类型&#xff1a;inline 和 attachment inline &#xff1a;将文件内容直接显示在页面 attachment&#xff1a;弹出对话框让用户下载 code: context.Response.ContentType "text/plain"; string fileName context.Request[&qu…

两个栈实现双端队列

一个笔试题&#xff0c;当时竟然没想出来&#xff0c;现在实现下 1 /*2 用两个栈实现双端队列3 栈s1&#xff0c;s2。4 pushback()和popback(),必须在s2为空的情况&#xff0c;把s2的都放s1中5 pushfront()和popfront(),必须是在s1为空&#xff0c;把s1的都给放到s2中6 */7 #in…

Java web 打印方案---数飞OA打印方案总结

Web系统中&#xff0c;打印功能一直是个老大难问题&#xff0c;因此产生了很多第三方的控件&#xff0c;多数要收费&#xff0c;而且跟自己的系统结合有一定的麻烦。数飞OA系统采用J2EE技术&#xff0c;jsp打印问题同样存在于OA中。 在数飞OA中&#xff0c;打印方式有三种&…

Linux ftp ldap认证,vsftpd+ldap认证

一、环境系统 CentOS 6.4x64最小化安装IP 192.168.3.19二、安装ldap[roottest ~]# yum install openldap openldap-* -y[roottest ~]# yum install nscd nss-pam-ldapd nss-* pcre pcre-* -y配置ldap[roottest ~]# cd /etc/openldap/[roottest openldap]# cp /usr/sha…

es6-变量的解构赋值

从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这被称为解构 let [foo, [[bar], baz]] [1, [[2], 3]]; foo // 1 bar // 2 baz // 3let [ , , third] ["foo", "bar", "baz"]; third // "baz"let [x, , y] [1, 2, 3];…

浏览器的渲染原理

看到这个标题大家一定会想到这篇神文《How Browsers Work》&#xff0c;这篇文章把浏览器的很多细节讲得很细&#xff0c;而且也被翻译成了中文。为什么我还想写一篇呢&#xff1f;因为两个原因&#xff0c; 1&#xff09;这篇文章太长了&#xff0c;阅读成本太大&#xff0c;不…

AO 直接调用GeoProcessing 工具

Geoprocessing是ArcGIS的一个基础组成部分。无论你是一个新手抑或老资格的专家&#xff0c;geoprocessing都是你使用ArcGIS完成每天工作的一部分。它提供了数据分析、数据管理和数据转换等对于所用GIS用户都必须的工具&#xff0c;当然也包括ArcObjects开发者。GIS程序通常需要…

Linux环境变量PSI指什么,PSI 文件扩展名: 它是什么以及如何打开它?

了解 PSI 问题常见的 PSI 打开问题缺少 PrimalScript双击你的 PSI 文件会提示消息 “%%os%% 无法打开 PSI 文件”。 通常&#xff0c;%%os%% 中会出现这种情况&#xff0c;因为 PrimalScript 未安装在你的电脑上。 由于您的操作系统不知道如何处理此文件&#xff0c;因此无法通…

linux 修改文件时间

1、ls -l *.sh 2、touch -d "10/13/2013" *.sh 【我想把所以的.sh文件修改到三个月前&#xff08;2013年10月13&#xff09;的时间。】3、ls -l *.sh 参考文章 http://blog.itpub.net/29283412/viewspace-1070106/ 另外也可以单独修改时间或者月份&#xff0c;如下以…