Codeforces 871D Paths (欧拉函数 + 结论)
题目链接 Round #440 Div 1 Problem D
题意 把每个数看成一个点,如果$gcd(x, y) \neq 1$,则在$x$和$y$之间连一条长度为$1$的无向边。
设$d(u, v)$为$u$到$v$之间的最短路,如果$u$和v不连通那么$d(u, v) = 0$
现在给定$n$,求所有的满足$1 <= u < v <= n$的$d(u, v)$之和。
首先把$1$和大于$\frac{n}{2}$的质数去掉,这些数和任何数之间的最短距离为$0$。
我们可以得出对于任意$u$, $v$,都有$d(u, v) <= 3$
若$u$和$v$非互素,那么$d(u, v) = 1$;
令$p(x)$为$x$的最小质因子。如果$p(u) \cdot p(v) <= n$,那么$d(u, v) = 2$
路径为$u - p(u) \cdot p(v) - v$
否则一定存在一条长度为3的路径:$u - 2u - 2v - v$
那么只要求出这三种路径的条数就可以了。
对于长度为$1$的路径,利用欧拉函数可以轻松求出。
对于长度为$2$的路径,设$c[x]$为$p[u] = x$的$u$的个数,$s[]$为$c[]$的前缀和。
那么长度为$2$的路径条数为$∑c_{i} * s_{[\frac{n}{i}]}$,注意去掉长度为$1$的情况。
最后长度为$3$的路径条数就是总的合法点对数减去长度为$1$的路径和长度为$2$的路径条数。
时间复杂度$O(nlogn)$
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i, a, b) for (int i(a); i <= (b); ++i)
- #define dec(i, a, b) for (int i(a); i >= (b); --i)
- #define MP make_pair
- #define fi first
- #define se second
- typedef long long LL;
- const int N = 1e7 + 10;
- int pri[N], p[N], phi[N], c[N], s[N];
- int n, m, tot, now;
- LL s1, s2, s3;
- int main(){
- scanf("%d", &n);
- phi[1] = 1;
- rep(i, 2, n){
- if (!p[i]){
- p[i] = pri[++tot] = i;
- phi[i] = i - 1;
- }
- rep(j, 1, tot){
- if (i * pri[j] > n) break;
- p[i * pri[j]] = pri[j];
- if (i % pri[j] == 0){
- phi[i * pri[j]] = phi[i] * pri[j];
- break;
- }
- else phi[i * pri[j]] = phi[i] * (pri[j] - 1);
- }
- }
- rep(i, 2, n) s1 += 0ll + i - 1 - phi[i];
- rep(i, 2, n) ++c[p[i]];
- rep(i, 2, n) s[i] = s[i - 1] + c[i];
- rep(i, 2, n) s2 += 1ll * c[i] * s[n / i];
- rep(i, 2, n) if (1ll * p[i] * p[i] <= n) --s2;
- s2 /= 2;
- s2 -= s1;
- m = n - 1;
- dec(i, tot, 1){
- if (pri[i] * 2 > n) --m;
- else break;
- }
- s3 = 1ll * m * (m - 1) / 2 - s1 - s2;
- printf("%lld\n", s1 + 2 * s2 + 3 * s3);
- return 0;
- }
Codeforces 871D Paths (欧拉函数 + 结论)的更多相关文章
- Codeforces 1114F(欧拉函数、线段树)
AC通道 要点 欧拉函数对于素数有一些性质,考虑将输入数据唯一分解后进行素数下的处理. 对于素数\(p\)有:\(\phi(p^k)=p^{k-1}*(p-1)=p^k*\frac{p-1}{p}\) ...
- Codeforces 1114F Please, another Queries on Array? [线段树,欧拉函数]
Codeforces 洛谷:咕咕咕 CF少有的大数据结构题. 思路 考虑一些欧拉函数的性质: \[ \varphi(p)=p-1\\ \varphi(p^k)=p^{k-1}\times (p-1)= ...
- Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...
- Codeforces 776E: The Holmes Children (数论 欧拉函数)
题目链接 先看题目中给的函数f(n)和g(n) 对于f(n),若自然数对(x,y)满足 x+y=n,且gcd(x,y)=1,则这样的数对对数为f(n) 证明f(n)=phi(n) 设有命题 对任意自然 ...
- CodeForces - 645F:Cowslip Collections (组合数&&欧拉函数)
In an attempt to make peace with the Mischievious Mess Makers, Bessie and Farmer John are planning t ...
- Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)
题目链接 Power Tower 题意 给定一个序列,每次给定$l, r$ 求$w_{l}^{w_{l+1}^{w_{l+2}^{...^{w_{r}}}}}$ 对m取模的值 根据这个公式 每次 ...
- Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)
题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ...
- codeforces 1009D Relatively Prime Graph【欧拉函数】
题目:戳这里 题意:要求构成有n个点,m条边的无向图,满足每条边上的两点互质. 解题思路: 显然1~n这n个点能构成边的条数,就是2~n欧拉函数之和(x的欧拉函数值代表小于x且与x互质的数的个数. 因 ...
- 欧拉函数 &【POJ 2478】欧拉筛法
通式: $\phi(x)=x(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3}) \cdots (1-\frac{1}{p_n})$ 若n是质数p的k ...
随机推荐
- ffifdyop
题目地址:http://www.shiyanbar.com/ctf/2036 后台登陆 上来看到这个界面,果断先看一波源代码. 看到是拼接字符串进行sql查询,就想到了注入了. 但是很不幸的是md5( ...
- python 之发送邮件服务[原著] 海瑞博客
Python 发送邮件 使用默认的django的发送邮件,只适用于单邮箱. 作者:海瑞博客 http://www.hairuinet.com/ setting中配置 # send e-mail EMA ...
- 解决使用Oracle数据库,项目启动由于表原因无法成功启动问题
1.仔细看异常信息,如果出现一个 翻译过来是 不仅仅这一张表,那就说明,在连接数据库,定位到表的时候有多张表,不知道连哪一张. 原因: 有多个用户,这两个用户下有相同的表. 就算是在不同的表空间也不 ...
- glance上传镜像
glance image-create --name "centos68-test" --file centos68.dsk \ --disk-format raw --conta ...
- 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...
- HDU 4760 Good Firewall ( Trie树 )
一开始看的时候就想歪了,比赛的时候一直在YY线段树区间覆盖,然后纠结节点数太多开不下怎么办啊啊啊啊…… 然后昨天吃饭的时候也在纠结这到底是个啥题,后来发现公共前缀->前缀??!!!!->这 ...
- HDU 3111 Sudoku ( Dancing Links 精确覆盖模型 )
推荐两篇学DLX的博文: http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细) http://yzmduncan.iteye.co ...
- Java 冒泡排序与快速排序的实现
冒泡排序 基本特点 (1)基于交换思想的排序算法 (2)从一端开始,逐个比较相邻的两个元素,发现倒序即交换. (3)一次遍历,一定能将其中最大(小)的元素交换到其最终位置上 排序过程模 ...
- (总结)Linux服务器上最简单的Nginx反向代理配置
Nginx不但是一款高性能的Web服务器,也是高性能的反向代理服务器.下面简单说说Nginx的反向代理功能. 反向代理是什么? 反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发 ...
- 【bzoj5015】[Snoi2017]礼物 矩阵乘法
题目描述 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋友到来以后,都会带给他之前所有人带来的礼物个数再 ...