【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 分类讨论+数学的更多相关文章

  1. ACM学习历程—CodeForces 590A Median Smoothing(分类讨论 && 数学)

    题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给一个串,头和尾每次变换保持不变. 中间的a[i]变成a[i-1],a[i],a[i+ ...

  2. UVaLive 6862 Triples (数学+分类讨论)

    题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...

  3. D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )

    D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...

  4. Codeforces 460D Little Victor and Set --分类讨论+构造

    题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...

  5. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

  6. 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil

    1177: [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1477  Solved: 589[Submit] Descri ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp

    题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x  问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...

  8. 【cf789B】Masha and geometric depression(分类讨论/暴力)

    B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...

  9. P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)

    题目链接:传送门 题目: 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k( ...

随机推荐

  1. EJB里的问题解答

    1.什么是EJB? EJB即Enterprise JavaBean是JavaEE应用的业务层技术标准,以这项技术开发的组件叫做EJB组件. EJB架构师一个用于开发和部署基于组件的分布式业务应用的组件 ...

  2. SharePoint 2013 隐藏左边快速启动菜单栏(Hiding the Quick Launch Bar)

    在SharePoint 2013默认网站页面中,很多时候,我们需要隐藏左边快速启动菜单栏,这时我们可以通过下面的样式来实现隐藏它. 和SharePoint 2010不太一样,方法改了,不过性质是一样的 ...

  3. datetimerangepicker配置及默认时间段展示

    <script type="text/javascript"> $(document).ready(function (){ //时间插件 $('#reportrang ...

  4. Lua中调用函数使用点号和冒号的区别

    1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(, ); mSprite:setPosition(, ); 对于初次接触 ...

  5. Installing the Eclipse Plugin for ADT

    http://developer.android.com/sdk/installing/installing-adt.html   Download the ADT Plugin Start Ecli ...

  6. 源码分析四(HashMap与HashTable的区别 )

    这一节看一下HashMap与HashTable这两个类的区别,工作一段时间的程序员都知道, hashmap是非线程安全的,而且key值和value值允许为null,而hashtable是非线程安全的, ...

  7. nginx: [emerg] getpwnam(“www”) failed错误

    linux 64系统中安装nginx时如果出现错误:nginx: [emerg] getpwnam(“www”) failed in ........解决方法1:      在nginx.conf中 ...

  8. vim中文手册

    http://vimcdoc.sourceforge.net/doc/help.html

  9. chrome插件开发之调试

    https://blog.csdn.net/qustdong/article/details/46046553

  10. spring 定时任务corn表达式

    * * * * * * *  秒 分 时 日 月 周 年 秒 * / - 0-59 分 * / - 0-59 时 * / - 0-23 * 匹配任意数据 / 每隔多少分钟执行一次 - 区间 案例 0 ...