【题目】F. Paths

【题意】给定数字n,图上有编号为1~n的点,两点当且仅当gcd(u,v)≠1时有连边,定义d(u,v)为两点间最短距离(若不连通则为0),求Σd(u,v),1<=u<v<=n,n<=10^7。

【算法】数论

【题解】对于1<=x<=n,当x=1或x是大于n/2的素数时,x是孤立节点。

令p[x]表示x的最小素因子,考虑任意一对点的连边情况:

1.d=0:当至少一个点是孤立节点时,d(u,v)=0,否则都能通过下面的情况到达。

2.d=1:当gcd(u,v)≠1时,对数为one=Σx-1-φ(x),1<=x<=n。

3.d=2:p[u]*p[v]<=n时,可以通过u - p[u]*p[v] - v这条路径到达。(思路:两边最小素因子的乘积是最小中转点)

4.d=3:通过 u - 2*p[u] - 2*p[v] - v 到达。(思路:用最小的素因子2沟通)

通过情况1,容易计算出除了孤立节点外的点对总数sum。

情况2也容易计算(记为one),那么只须计算出情况3,情况4也可以用sum减去2和3得到。

如何计算满足p[u]*p[v]<=n&&gcd(u,v)=1的点对数?先计算满足p[u]*p[v]<=n(1<=u,v<=n)的点对数,然后减去u=v的情况,除以2后再减去one(u,v互素)即可得到。

复杂度O(n)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=;
int prime[maxn],p[maxn],n,tot,phi[maxn],num[maxn],can;
ll one=,two=,three=,s[maxn];
int main(){
scanf("%d",&n);
phi[]=;
for(int i=;i<=n;i++){
if(!p[i]){p[i]=prime[++tot]=i;phi[i]=i-;}
for(int j=;j<=tot&&i*prime[j]<=n;j++){
p[i*prime[j]]=prime[j];
if(i%prime[j]==){phi[i*prime[j]]=phi[i]*prime[j];break;}
phi[i*prime[j]]=phi[i]*(prime[j]-);
}
}
for(int i=;i<=n;i++)one+=i--phi[i];
for(int i=;i<=n;i++)num[p[i]]++;
for(int i=;i<=n;i++)s[i]=s[i-]+num[i];
for(int i=;i<=n;i++)two+=1ll*num[i]*s[n/i];
for(int i=;i<=n;i++)if(1ll*p[i]*p[i]<=n)two--;
two=two/-one;
three=;can=n-;
for(int i=;i<=tot;i++)if(prime[i]*>n)can--;
three=1ll*can*(can-)/-two-one;
printf("%lld",one*+two*+three*);
return ;
}//learn from 1234567891

最新文章

  1. WPF实现三星手机充电界面
  2. Markdown使用指南(2)—— 键盘符号说明
  3. HttpClientUtil简介
  4. jQuery-表单流程导航
  5. Objective-C 变量和基本的数据类型
  6. lintcode:递归打印数字
  7. apache开源项目 -- Wicket
  8. C++箴言:理解 new-handler的行为
  9. stm32 ARM中的RO、RW和ZI DATA
  10. Tapestry5.3使用总结
  11. DTCoreText
  12. 2015 多校联赛 ——HDU5323(搜索)
  13. [小技巧]EF Core中如何获取上下文中操作过的实体
  14. 如何让浏览器支持ES6语法,步骤详细到小学生都能看懂!
  15. 利用Sklearn实现加州房产价格预测,学习运用机器学习的整个流程(包含很多细节注解)
  16. Net Core集成Exceptionless分布式日志功能以及全局异常过滤
  17. std::vector push_back报错Access violation
  18. 第33课 main函数与命令行参数
  19. python二维码操作:QRCode和MyQR入门
  20. 初学spring-boot

热门文章

  1. 3dContactPointAnnotationTool开发日志(三十)
  2. Servlet处理表单
  3. 软工网络15团队作业4-DAY3
  4. 还原 listagg/wm_concat 后的数据 pack_split_listatt ;
  5. QT学习记录
  6. 零拷贝Zero-Copy(NIO)
  7. React.js学习笔记(一):组件协同与mixin
  8. HDU4472_Count
  9. 解决二维数组转为ArrayList集合问题
  10. Java开发Excel POI getPhysicalNumberOfCells 与 getLastCellNum的区别