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. 最详细的Android SDK下载安装及配置教程-------全文均为引用

    <https://www.cnblogs.com/gufengchen/p/11038029.html>

  2. 脚本注入2(post)

    终于写到非get类型的注入了. 不过,我懒得在这里搞代码审计了:留到存储型XSS原型的时候再来分析源码吧. 这次以Less-15为例. 框里随便输点东西,submit,抓包,发现包出现了一些改变: 同 ...

  3. Hadoop MapReduce 保姆级吐血宝典,学习与面试必读此文!

    Hadoop 涉及的知识点如下图所示,本文将逐一讲解: 本文档参考了关于 Hadoop 的官网及其他众多资料整理而成,为了整洁的排版及舒适的阅读,对于模糊不清晰的图片及黑白图片进行重新绘制成了高清彩图 ...

  4. 攻防世界 杂项 1.base64÷4

    666C61677B45333342374644384133423834314341393639394544444241323442363041417D 根据题目base64÷4得base16 在线工 ...

  5. Spring事务不生效问题

    事务未生效可能造成严重的数据不一致性问题,因而保证事务生效至关重要.Spring事务是通过Spring aop实现的,所以不生效的本质问题是spring aop没生效,或者说没有代理成功,所以有必要了 ...

  6. 用tsc编译ts文件的时候报错,tsc : 无法加载文件,因为在此系统上禁止运行脚本;

    用tsc编译ts文件的时候报错,tsc : 无法加载文件,因为在此系统上禁止运行脚本:SecurityError 在vscode的控制台或者Windows PowerShell中用tsc命令编译ts文 ...

  7. Linux下安装、配置、启动与访问RabbitMQ

    一.下载 首先第一步要下载三个rpm安装包,为了方便安装与学习,给出下载途径 网盘网址:https://pan.baidu.com/s/18Z64Lb9KQpRh10RzqZBdoQ 提取码:094v ...

  8. storm提交拓扑报错processing getcomponentpendingprofileactions

    storm提交新的拓扑,拓扑能提交成功,但是在UI界面查看时每个bolt报错Thrift.processing getComponentPendingProfileActions异常. 原因:stor ...

  9. 运行脚本 结果出现 Vim: Warning 并且卡住不能输入其它命令

    当我在执行一个 关于执行linux操作的php脚本时,就出现了以下信息:"Vim: Warning: Output is not to a terminal",接着出现了一大堆的字 ...

  10. 跟着老猫来搞GO-容器(1)

    前期回顾 前面的一章主要和大家分享了GO语言的函数的定义,以及GO语言中的指针的简单用法,那么本章,老猫就和大家一起来学习一下GO语言中的容器. 数组 数组的定义 说到容器,大家有编程经验的肯定第一个 ...