【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;
}
【CF870F】Paths 分类讨论+数学的更多相关文章
- ACM学习历程—CodeForces 590A Median Smoothing(分类讨论 && 数学)
题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给一个串,头和尾每次变换保持不变. 中间的a[i]变成a[i-1],a[i],a[i+ ...
- UVaLive 6862 Triples (数学+分类讨论)
题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...
- D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )
D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...
- Codeforces 460D Little Victor and Set --分类讨论+构造
题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...
- BZOJ-1067 降雨量 线段树+分类讨论
这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...
- 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil
1177: [Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1477 Solved: 589[Submit] Descri ...
- Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp
题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x 问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...
- 【cf789B】Masha and geometric depression(分类讨论/暴力)
B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...
- P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)
题目链接:传送门 题目: 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k( ...
随机推荐
- EJB里的问题解答
1.什么是EJB? EJB即Enterprise JavaBean是JavaEE应用的业务层技术标准,以这项技术开发的组件叫做EJB组件. EJB架构师一个用于开发和部署基于组件的分布式业务应用的组件 ...
- SharePoint 2013 隐藏左边快速启动菜单栏(Hiding the Quick Launch Bar)
在SharePoint 2013默认网站页面中,很多时候,我们需要隐藏左边快速启动菜单栏,这时我们可以通过下面的样式来实现隐藏它. 和SharePoint 2010不太一样,方法改了,不过性质是一样的 ...
- datetimerangepicker配置及默认时间段展示
<script type="text/javascript"> $(document).ready(function (){ //时间插件 $('#reportrang ...
- Lua中调用函数使用点号和冒号的区别
1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(, ); mSprite:setPosition(, ); 对于初次接触 ...
- Installing the Eclipse Plugin for ADT
http://developer.android.com/sdk/installing/installing-adt.html Download the ADT Plugin Start Ecli ...
- 源码分析四(HashMap与HashTable的区别 )
这一节看一下HashMap与HashTable这两个类的区别,工作一段时间的程序员都知道, hashmap是非线程安全的,而且key值和value值允许为null,而hashtable是非线程安全的, ...
- nginx: [emerg] getpwnam(“www”) failed错误
linux 64系统中安装nginx时如果出现错误:nginx: [emerg] getpwnam(“www”) failed in ........解决方法1: 在nginx.conf中 ...
- vim中文手册
http://vimcdoc.sourceforge.net/doc/help.html
- chrome插件开发之调试
https://blog.csdn.net/qustdong/article/details/46046553
- spring 定时任务corn表达式
* * * * * * * 秒 分 时 日 月 周 年 秒 * / - 0-59 分 * / - 0-59 时 * / - 0-23 * 匹配任意数据 / 每隔多少分钟执行一次 - 区间 案例 0 ...