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. 2021 从零开始学Git【新版本Git - 8000字详细介绍】

    我写的这篇文章,主要是记录自己的学习过程,也希望帮助读者少踩坑(比如不同版本可能命令不兼容等).本文面向git零基础初学者,建议读者按照文中命令自己全部操作一遍(注意运行环境). 我的运行环境:win ...

  2. ffmpeg剪视频

    ffmpeg裁剪合并视频   ffmpeg提供简单的命令参数: ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTP ...

  3. Beta实际开发与初始计划的比较

    零.说明 本篇博客为Beta阶段开始十天后,实际开发工作与初始计划的比较 截止至本篇博客发布为止,团队所有成员已完成计网考试,将在本周日进行充分的接口测试 一.比较 1.与初始计划对比 初始计划 实际 ...

  4. UVA-1016 Silly Sort

    UVA-1016 题目大意:给定一个长度为n的序列,每次操作可以交换任意两个数的位置,代价为两个数的和,求最小代价,将序列排成有序的. 首先,显然需要交换的数一定会形成环: 那么对于每一个环,我们有两 ...

  5. openmp学习心得(一)

    主要在vs2015下使用OMP,写一些自己omp的学习心得: 一.在VS2015下OpenMP的使用: 1.VS2015也仅仅支持OpenMP2.0版本,VS对OpenMP的支持并不太好. 2.在VS ...

  6. Python触发异常

    我们可以使用raise语句自己触发异常,raise语法格式如下: raise [Exception [, args [, traceback]]] 语句中 Exception 是异常的类型(例如,Na ...

  7. 应对gitee容量超限. 保留star/fork/评论

    应对gitee容量超限 进入企业版,"管理"-"仓库管理",点"清空仓库". 在E:\gitee目录上右击,"git bash h ...

  8. 服务集与AP的配合

    一.实验目的 1)掌握添加无线网络配置 2)掌握配置信道和协议使用并配置在一个天线上同时运行两个服务集,即两个无线网络 二.实验仪器设备及软件 仪器设备:一台AC,两台AP,一台AR,一台LSW 软件 ...

  9. Android App隐私合规检测辅助工具(Camille)

    Camille Android App隐私合规检测辅助工具,项目仓库:https://github.com/zhengjim/camille 简介 现如今APP隐私合规十分重要,各监管部门不断开展AP ...

  10. 记一次,因表变量导致SQL执行效率变慢

    场景 最近工作中,发现某同步JOB在执行中经常抛出SQL执行超时的问题,查看日志发现每次SQL执行的时间都是线性增长的,循环执行50次以后执行时间甚至超过了5分钟 JOB执行流程分析  首先,对于JO ...