Codeforces 题目传送门 & 洛谷题目传送门

首先考虑 \(d(u,v)\) 是个什么东西,分情况讨论:

  • \(u\not\perp v\),\(d(u,v)=1\)
  • \(u\perp v\),记 \(p_u\) 为 \(u\) 的最小质因子,\(p_v\) 为 \(v\) 的最小质因子,那么继续分情况讨论:
    • \(p_up_v\le n\),\(d(u,v)=2\)(\(u\to p_up_v\to v\))
    • \(p_up_v>n\) 且 \(\max(p_u,p_v)\le\dfrac{n}{2}\),\(d(u,v)=3\)(\(u\to 2p_u\to 2p_v\to v\))
    • \(p_up_v>n\) 且 \(\max(p_u,p_v)>\dfrac{n}{2}\),\(d(u,v)=0\)

考虑对这四种情况分别计算,对于 \(d(u,v)=1\) 显然预处理出欧拉函数即可处理,即 \(\dbinom{n-1}{2}-\sum\limits_{i=1}^n(\varphi(i)-1)\)(由于 \(1\) 不能与任何点连边,因此 \(d(u,v)\ne 0\) 的点只可能在另外 \(n-1\) 个点之间),对于 \(d(u,v)=2\) 的情况直接处理比较困难,因此考虑正难则反,拿总方案数减去另外三种情况的方案数即可计算,对于第三种情况,由于 \(p_up_v>0\),因此在 \([1,n]\) 中不存在某个数既是 \(p_u\) 也是 \(p_v\) 的倍数,因此对于某个固定的 \(p_u,p_v\),合法的 \(u,v\) 的对数即是 \([1,n]\) 中 \(p_x=p_u\) 的 \(x\) 的个数与 \([1,n]\) 中 \(p_x=p_v\) 的 \(x\) 的个数之积。我们不妨假设 \(p_u<p_v\),我们记 \(cnt_x\) 表示 \([1,n]\) 中有多少个数最小质因子为 \(x\),那么考虑枚举 \(p_u\),合法的 \(p_v\) 必然在区间 \((\max(p_u,\dfrac{n}{p_u}),\dfrac{n}{2}]\) 之间,前缀和优化一下即可。对于第四种情况也同理,枚举 \(p_u\),合法的 \(p_v\) 在区间 \((\max(i,\dfrac{n}{2}),n]\) 之间。第二种情况减一下即可,复杂度线性。

最后讲一下我翻车的现场,我是考虑求出分别求出 \(d(u,v)=1/2/3\) 的情况并将它们的贡献加起来,\(d(u,v)=1,3\) 的情况自然是很容易求得的,但是 \(d(u,v)=2\) 的情况不好计算,然后我就一直在分析如何计算这种情况的方案数,xtbz……看来以后对于计算方案数的问题,如果正面计算比较困难要学会正难则反,学到了学到了(

const int MAXN=1e7;
int n,pr[MAXN/10+5],prcnt=0,mnp[MAXN+5],phi[MAXN+5],cnt[MAXN+5];
bitset<MAXN+5> vis;
void sieve(){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis.test(i)){pr[++prcnt]=i;phi[i]=i-1;mnp[i]=i;}
for(int j=1;pr[j]*i<=n&&j<=prcnt;j++){
vis[pr[j]*i]=1;mnp[pr[j]*i]=pr[j];
if(i%pr[j]==0){phi[pr[j]*i]=phi[i]*pr[j];break;}
else phi[pr[j]*i]=phi[i]*phi[pr[j]];
}
}
}
int calc(int l,int r){return (l>r)?0:(cnt[r]-cnt[l]);}
int main(){
scanf("%d",&n);sieve();ll sum=0,ans0=0,ans1=0,ans2=0,ans3=0;
for(int i=2;i<=n;i++) cnt[mnp[i]]++;
for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];
for(int i=1;i<=n;i++) sum+=phi[i]-1;
ans1=1ll*(n-1)*(n-2)/2-sum;
for(int i=1;i<=n;i++){
int num=cnt[i]-cnt[i-1];
if(i<=n/2) ans3+=1ll*num*calc(max(i,n/i),n/2);
ans0+=1ll*num*calc(max(n/2,i),n);
} ans2=sum-ans0-ans3;
printf("%lld\n",ans1+(ans2<<1)+(ans3<<1)+ans3);
return 0;
}

Codeforces 870F - Path(数论+分类讨论+正难则反)的更多相关文章

  1. FZU 2122 又见LKity【字符串/正难则反/KMP/把一个字符串中某个部分替换为另一个部分】

    嗨!大家好,在TempleRun中大家都认识我了吧.我是又笨又穷的猫猫LKity.很高兴这次又与各位FZU的ACMer见面了.最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压 ...

  2. P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)

    P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...

  3. Educational Codeforces Round 74 (Rated for Div. 2)【A,B,C【贪心】,D【正难则反的思想】】

    A. Prime Subtractiontime limit per test2 secondsmemory limit per test256 megabytesinputstandard inpu ...

  4. Codeforces.520B.Two Buttons(正难则反)

    题目链接 \(Description\) 给定两个数\(n,m\),每次可以使\(n\)减一或使\(n\)乘2.求最少需要多少次可以使\(n\)等于\(m\). \(Solution\) 暴力连边BF ...

  5. CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]

    题意: 给出无向图. good way : 仅有两条边只经过一次,余下边全经过两次的路 问你共有多少条不同的good way. 两条good way不同仅当它们所经过的边的集合中至少有一条不同 (很关 ...

  6. Codeforces Round #189 (Div. 2) A. Magic Numbers【正难则反/给出一个数字串判断是否只由1,14和144组成】

    A. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. CF 1005B Delete from the Left 【模拟数组操作/正难则反】

    You are given two strings s and t. In a single move, you can choose any of two strings and delete th ...

  8. 树上统计treecnt(dsu on tree 并查集 正难则反)

    题目链接 dalao们怎么都写的线段树合并啊.. dsu跑的好慢. \(Description\) 给定一棵\(n(n\leq 10^5)\)个点的树. 定义\(Tree[L,R]\)表示为了使得\( ...

  9. 洛谷 P1049 装箱问题【正难则反/01背包】

    题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余 ...

随机推荐

  1. python jinja2初见

    吸取了长城杯的教训,学习python-web迫在眉睫. 正常难度的python_template_injection,由于现在没学面向对象,理解原理比较困难,所以先使用简单版复现:并附上正常版的常用p ...

  2. python web1

    ***本篇中的测试均需要使用python3完成. 攻击以下面脚本运作的服务器. 针对脚本的代码逻辑,写出生成利用任意代码执行漏洞的恶意序列的脚本: 打开攻击机端口, 将生成的东西输入网页cookie: ...

  3. Jupyter Notebook配置多个kernel

    Jupyter Notebook配置多个kernel 前言: 在anaconda下配置了多个环境,而Jupiter Notebook只是安装在base环境下,为了能在Jupiter Notebook中 ...

  4. STM32时钟系统之利用 systick 定时器来实现准确的延时。

    本篇文章带着大家来认识一下 STM32 的时钟系统,以及利用 systick 定时器来实现一个比较准确的延时. 我们首先从时钟说起,时钟在MCU中的作用,就好比于人类的心脏一样不可或缺.STM32 的 ...

  5. 21.10.14 test

    题目 WOJ5078 到 WOJ5081 T1 Problem A \(\color{green}{100}\) 由于每轮要选择尽量多的边删除,所以想到无向图的生成树,因为在生成树上再加一条边就会形成 ...

  6. 数据治理之元数据管理的利器——Atlas入门宝典

    随着数字化转型的工作推进,数据治理的工作已经被越来越多的公司提上了日程.作为Hadoop生态最紧密的元数据管理与发现工具,Atlas在其中扮演着重要的位置.但是其官方文档不是很丰富,也不够详细.所以整 ...

  7. freeswitch的docker构建过程

    概述 Docker是一个开源的应用容器引擎,可以让开发者打包应用以及依赖包到一个轻量级.可移植的容器中,并在任何安装有Docker的机器上运行. Docker 使你能够将应用程序与基础架构分开,从而可 ...

  8. STC单片机控制28BYJ-48步进电机

    STC单片机4*4按键控制步进电机旋转 28BYJ-48型步进电机说明 四相永磁式的含义 28BYJ-48工作原理 让电机转起来 最简单的电机转动程序 电机转速缓慢的原因分析 便于控制转过圈数的改进程 ...

  9. [python]django关闭debug

    1.版本声明 python3.6.5 django2.0.6 2.打开项目-setting setting.py中DEBUG默认是等于True,这样的话当访问接口存在错误会直接展示项目的所有配置信息, ...

  10. Spring 之 BeanFactory 源码 - 接口分析

    一.BeanFactory的基本类体系结构(接口为主):