【CF870F】Paths 分类讨论+数学
【CF870F】Paths
题意:一张n个点的图,对于点i,j(i!=j),如果gcd(i,j)!=1,则i到j有一条长度为1的无向边。令dis(i,j)表示从i到j的最短路,如果i无法到j,则dis(i,j)=0。求$\sum\limits_{1\le i < j \le n}dis(i,j)$。
n<=10^7
题解:容易发现dis(i,j)不超过3,所以我们可以分出好多种情况讨论一下,但是每种情况都不好搞啊。
我们先把点1扔了,算出总点对数。我们定义一个数x是坏的当且仅当x是质数且x>n/2。然后讨论:
1.dis(x,y)=0。这种情况发生当且仅当x或y是坏的,容易计算答案。
2.dis(x,y)=1。就是求有多少不互质的数对嘛,用欧拉函数算一下就行。
3.dis(x,y)=2。我们设x的最小质因子为p(x),那么这样的路径形如x->p(x)p(y)->y。此时还要讨论:
1.如果x,y都是质数,则xy<=n,这个暴力统计就行。
2.如果x是好质数y是合数,则x*p(y)<=n且x不是y的约数。我们先求出所有x*p(y)<=n的个数,然后去掉x是y的约数的点对。
这个怎么算呢?如果x==p(y),这样的点对数很容易求。如果x>p(y),我们可以从大到小枚举x,那么y/x<=n/x,我们同时枚举所有的y/x,如果p(y/x)小于x,那么我们统计上它的贡献;否则它对以后的x都不会产生贡献。最后我们再把p(y/x)=x的去掉即可。
3.如果x,y是互质的合数,依旧用欧拉函数算一下就行。
4.dis(x,y)=3。形如x->2p(x)->2p(y)->y。用总数-上面的3个即可得到。
#include <cstdio>
#include <cstring>
#include <iostream>
const int N=10000010;
typedef long long ll;
int pri[N/5],mn[N],sx[N],phi[N],sp[N],sn[N];
int n,num,m;
ll cnt0,cnt1,cnt2,cnt3,tot,now;
inline int min(const int &a,const int &b) {return a<b?a:b;}
int main()
{scanf("%d",&n);int i,j;phi[1]=mn[1]=1;for(i=2;i<=n;i++){if(!sx[i]){pri[++num]=i,mn[i]=i,phi[i]=i-1,sx[i]=1;if(i<=n/2) m=num;}sp[i]=num;for(j=1;j<=num&&i*pri[j]<=N;j++){mn[i*pri[j]]=pri[j];if(i%pri[j]==0){sx[i*pri[j]]=sx[i],phi[i*pri[j]]=phi[i]*pri[j];break;}sx[i*pri[j]]=sx[i]+1,phi[i*pri[j]]=phi[i]*(pri[j]-1);}}tot=1ll*(n-1)*(n-2)/2;for(i=m+1;i<=num;i++) cnt0+=pri[i]-2+n-pri[i]-(num-i);for(i=2;i<=n;i++) cnt1+=i-1-phi[i];for(i=2;i<=n;i++) if(mn[i]!=i) cnt2+=phi[i]-sp[i]+sx[i]-1;for(i=2;i<=n;i++) if(mn[i]!=i){cnt2+=min(m,sp[n/mn[i]]);if(1ll*mn[i]*mn[i]<=n) cnt2--;}for(j=2,i=m;i>=1;i--){for(;j<=n/pri[i];j++) if(mn[j]<pri[i]) sn[mn[j]]++,now++;now-=sn[pri[i]];cnt2-=now;}for(i=1;i<=m;i++) for(j=1;j<i&&pri[i]*pri[j]<=n;j++) cnt2++;cnt3=tot-cnt0-cnt1-cnt2;printf("%lld",cnt1+cnt2*2+cnt3*3);return 0;
}
转载于:https://www.cnblogs.com/CQzhangyu/p/8157601.html
【CF870F】Paths 分类讨论+数学相关推荐
- HDU 6627 equation(模拟,分类讨论)
题意:给你n个ai和bi,给你C,求解方程: 分析:初中数学,分类讨论破除绝对值符号.每两个零点之间的区域都对应一个一元一次方程,把这些零点排序之后可以很容易得到每个区间的方程,每个区间都解一个一元一 ...
- 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)
题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...
- CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #694 (Div. 2) D 很好的一道数论思维题 D - Str ...
- Unfair contest 模拟-分类讨论
题意 : 两人比赛,n个裁判,给分范围[1,h][1, h][1,h],去掉s个最高分和t个最低分,给出n - 1个裁判的给分,第n个裁判想让第1个人赢,并且最小化给1的分数a[n]a[n]a[n] ...
- 2020ICPC(上海) - Walker(分类讨论+二分)
题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...
- 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)
[UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...
- uoj#246. 【UER #7】套路(dp+分块?分类讨论?)
题目链接 分析: 目前为止我只能理解dp部分 我就喜欢这种单纯不做作的题目 一看名字就明白了这道题的本质 中二的题目描述 很显然,我们的关键就是求出最小相似度 朴素算法n^4 如果我们现在有一个权值数 ...
- Vasya and Multisets CodeForces - 1051C 模拟|分类讨论
题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到 然后分类讨论 完整地正确分类就AC 否则gg 如果数量为 ...
- P3842 [TJOI2007]线段(线性dp,分类讨论)
P3842 [TJOI2007]线段 题意 [TJOI2007]线段 题目描述 在一个 n×nn \times nn×n 的平面上,在每一行中有一条线段,第 iii 行的线段的左端点是(i,Li)(i ...
- POJ 1664 求m个苹果放入n个盘子的不同放法数目 递归 分类讨论
通过分类讨论,将规模较大的问题转换成规模较小的相同问题,学会"降维",将索引值不断降小,就可以递归求解 设f(m,n)为把m个苹果放到n个盘子中的方法数,m>=0,n> ...
最新文章
- 【tensorflow】】模型优化(一)指数衰减学习率
- 仿Twitter的公告效果
- quantrader和matlab不匹配,【Matlab量化投资】支持向量机择时策略
- QQ在屏幕边缘自动隐藏不能正常显示
- ruby 数据sql操作
- 马斯克挽尊,回应为何电动皮卡车窗玻璃怼不过钢球...
- 【转】软件开发常用术语
- c++ 暂停功能_苹果拥抱Rust,正在将C代码移植到Rust
- 一文带你完全掌握机器人DH参数建模(详细步骤+实例+代码)
- 斯皮尔曼相关系数范围_什么是斯皮尔曼相关系数
- NAT(地址转换技术)详解
- 调整计算机硬盘大小,详细教您怎么调整硬盘分区
- 【机器学习】在生产环境使用Kafka构建和部署大规模机器学习
- 又是苦海泛起爱恨,在世间难逃命运的新一周
- html九宫格排列图片,10款jQuery实现的360浏览器九宫格图片拖拽排序
- 车辆保险详细说明举例介绍
- 精卫填海——大数据安全与隐私保护
- 头哥 (Educoder)数据结构与算法实验:实验11 TYJ动态规划
- opencv实战——图像矫正算法深入探讨
- 金融科技大数据产品推荐:荣之联·风报—人工智能企业情报分析系统
热门文章
- 时间机器与iCloud云盘:应该使用哪个来备份你的Mac?
- 只需一个设置命令隐藏 MacBook Pro 浏海
- iOS开发之来自一线开发者的Swift学习资源推荐
- Compressor 4.6.1 for Mac(视频转码工具)
- SQLPro Studio for Mac(数据库管理器)2022.14
- 可以修改Mac地址的工具WiFiSpoof for Mac
- 2个技巧让Mac常用文件夹在Finder打开更便捷
- 深度剖析Spring Cloud底层原理
- 传奇电子cq9跳高高、跳起来规则与操作技巧
- tomcat7简单优化