zoukankan      html  css  js  c++  java
  • 线性筛求欧拉函数(转载)

    转自:https://www.luogu.org/blog/JustinRochester/solution-p2158

     

    根据图像,易得出,所有的点都是关于 $y=x$ 对称的(这个性质我们待会儿要用到)

    根据题目,如何判定一个点是否看得到呢?

    我们假设一个点看不到,那么,根据图像的直观意义,便可以知道,这个点和原点连线的中间有一个点,假设该点为 $({x over lambda},{y over lambda}),(lambda>1)$

    那么,因为该点存在,故该点的横纵坐标都属于整数,即 ${x over lambda} in Z$ , ${y over lambda} in Z$

    因此,$lambda |x,lambda |y$

    即 $lambda|gcd(x,y)$

    因此 $gcd(x,y) geq lambda >1$

    也就是说,对于一个点 $(x,y)$ 当且仅当 $gcd(x,y) eq 1$ 时这个点看不到

    因此,题目对于给定的 $n$ 所求的点数 $ans(n)$ 即满足

    $ans(1)=0$

    $ans(n)= sum_{x=0}^{n-1} sum_{y=0}^{n-1} [gcd(x,y)=1],n geq 2$

    当然,我们知道 $gcd(0,i)$ 是没有意义的,因此,我们对于某一项为 $0$ 的情况单独拉出来讨论

    因为对于 $x=0$ 和 $y=0$ 的直线上,只有 $(0,1),(1,0)$ 两个点看得到

    所以这边可以来一个特殊化处理,从而得到

    $ans(n)= sum_{x=1}^{n-1} sum_{y=1}^{n-1} [gcd(x,y)=1]+2,n geq 2$

    显然,这个式子可以展开为

    $ans(n)=sum_{x=1}^{n-1} sum_{y=1}^{x-1}[gcd(x,y)=1]+ sum_{x=1}^{n-1} sum_{y=x}^x [gcd(x,y)=1] + sum_{x=1}^{n-1} sum_{y=x+1}^{n-1}[gcd(x,y)=1]+2,n geq 2$

    又因为 $y=x$ 上能被看到的点只有点 $(1,1)$ ,所以我们可以直接考虑这个点,然后忽略这条直线了

    因此,我们可以将这个式子化简为

    $ans(n)=sum_{x=1}^{n-1} sum_{y=1}^{x-1}[gcd(x,y)=1]+ 1 + sum_{x=1}^{n-1} sum_{y=x+1}^{n-1}[gcd(x,y)=1]+2,n geq 2$

    $ans(n)=sum_{x=1}^{n-1} sum_{y=1}^{x-1}[gcd(x,y)=1] + sum_{x=1}^{n-1} sum_{y=x+1}^{n-1}[gcd(x,y)=1]+3,n geq 2$

    由文章最上方写的图像的原理,我们可以知道

    $sum_{x=1}^{n-1} sum_{y=1}^{x-1}[gcd(x,y)=1]= sum_{x=1}^{n-1} sum_{y=x+1}^{n-1}[gcd(x,y)=1]$

    因此 $ans(n)=2sum_{x=1}^{n-1} sum_{y=1}^{x-1}[gcd(x,y)=1]+3,n geq 2$

    又因为根据欧拉函数 $varphi (n)$ 的定义,为小于 $n$ 且与 $n$ 不互质的数

    即 $varphi (n)=sum_{i=1}^{n-1} [gcd(i,n)=1]$

    因此,我们可以将式子简化为

    $ans(n)=2sum_{x=1}^{n-1} varphi(x) +3,n geq 2$

    那么,根据定义,可以直接知道 $varphi(1)=0$

    所以,式子我们也可以这么写

    $ans(n)=2sum_{x=2}^{n-1} varphi(x) +3,n geq 2$

    终于,我们得到了本题的答案

    $ans(1)=0$

    $ans(n)=2 sum_{x=2}^{n-1} varphi(x)+3 , n geq 2$


    那么,这里对于如何求 $varphi(n)$ 做一个讲解,已经掌握的大佬们请直接跳过

    首先, $varphi(n)$ 的定义是在小于 $n$ 的正整数中,与 $n$ 互质的数的个数

    因此,我们先考虑一下,假设存在一个质数 $p$

    那么, $p$ 的因数只有 $1$ 和 $p$

    在小于 $p$ 的正整数中,不存在任何数含有因数 $p$

    因此, $p$ 和任意比它小的正整数都互质

    也就是性质1 $varphi(p)=p-1$ ( $p-1$ 个数比它小)

    接下来,我们考虑 $p^k,k in Z_+$ 且 $k>1$

    $p^k$ 有且仅有质因数 $p$

    且比它小的 $(p^k-1)$ 个数中,存在一下几个数也含有质因数 $p$

    $p,2p,3p,4p......(p^{k-1}-1)p$

    共 $(p^{k-1}-1)$ 个数

    因此,剩余的 $(p^k-1)-(p^{k-1}-1)=(p^k-p^{k-1})$ 个数都与之互质

    于是我们可以把 $k=1$ 看成这个的一个特例

    于是我们得到性质2 $varphi(p^k)=p^k-p^{k-1},k in Z_+$

    同时,又因为 $varphi(p^{k+1})=p^{k+1}-p^k=p imes(p^k-p^{k-1})$

    所以,还能得到性质3 $varphi(p^{k+1})=p imes varphi(p^k)$

    接下来,我们考虑 $varphi(p_1^{k_1} p_2^{k_2})$

    $(p_1 eq p_2$ 且 $p_1,p_2$ 为质数 $,k_1,k_2 in Z_+)$

    那么,在比它小的 $(p_1^{k_1} p_2^{k_2}-1)$ 个数中

    $p_1,2p_1,3p_1,4p_1......,(p_1^{k_1-1} p_2^{k_2}-1)p_1$ 共 $(p_1^{k_1-1} p_2^{k_2}-1)$ 个数与它的最大公因数中含 $p_1$

    同理,共 $(p_1^{k_1} p_2^{k_2-1}-1)$ 个数与它最大公因数含 $p_2$

    但是,这里还有这重复枚举

    $p_1p_2,2p_1p_2,3p_1p_2,4p_1p_2......(p_1^{k_1-1} p_2^{k_2-1}-1)p_1p_2$ 共 $(p_1^{k_1-1} p_2^{k_2-1}-1)$ 个数被重复枚举

    因此,根据容斥原理,我们可以得到

    $varphi(p_1^{k_1}p_2^{k_2})$

    $=(p_1^{k_1} p_2^{k_2}-1)-(p_1^{k_1-1} p_2^{k_2}-1)-(p_1^{k_1} p_2^{k_2-1}-1)+(p_1^{k_1-1} p_2^{k_2-1}-1)$

    $=p_1^{k_1} p_2^{k_2}-p_1^{k_1-1} p_2^{k_2}-p_1^{k_1} p_2^{k_2-1}+p_1^{k_1+1} p_2^{k_2+1}$

    $=(p_1^{k_1}-p_1^{k_1-1})(p_2^{k_2}-p_2^{k_2-1})$

    又因为根据性质2,有

    $varphi(p_1^{k_1})=(p_1^{k_1}-p_1^{k_1-1}),varphi(p_2^{k_2})=(p_2^{k_2}-p_2^{k_2-1})$

    因此,带入上式得到性质4 $varphi(p_1^{k_1}p_2^{k_2})=varphi(p_1^{k_1})varphi(p_2^{k_2})$

    综合以上5个性质,我们假设 $n=Pi_{i=1}^mp_i^{k_i}$

    可得性质6 $varphi(n)=varphi(Pi_{i=1}^mp_i^{k_i})=Pi_{i=1}^mvarphi(p_i^{k_i})=Pi_{i=1}^m(p_i^{k_i}-p_i^{k_i-1})$

    故此,我们对任意数的欧拉函数值都可求了

    同样的,性质6整理还可得到

    性质7 $varphi(n)=Pi_{i=1}^m(p_i^{k_i}-p_i^{k_i-1})=Pi_{i=1}^mp_i^{k_i}(1-{1 over p_i})=nPi_{i=1}^m(1-{1 over p_i})$

    因此,对于本蒟蒻所知的 $varphi(n)$ 函数性质已经全部讲完(愣是码了三天......)


    那么,我们开始讲线性筛

    参考素数的线性筛,为了保证时间的线性,那么,就必须保证每个数只筛到一次

    为了保证每个数只被筛到一次,一定要保证其只被其最小素因数筛到过

    那么,线性筛 $varphi(n)$ 也是一样

    对于枚举到的 $i(i geq 2)$,我们用 $pf_i$ 储存它的最小质因数

    倘若出现 $pf_i=0$,则说明 $i$ 的最小质因数在 $2$~$(i-1)$ 都并未出现

    因此,足以证明 $i$ 为质数

    所以,$pf_i=i,varphi(i)=i-1$ ,并将 $i$ 存入到质数表中

    接下来,无论 $i$ 是否为质数,直接在质数表中枚举质数 $prime_j$

    倘若 $prime_j leq pf_i$ 那么,显然 $pf_{i imes prime_j}=prime_j$

    若 $prime_j|i$ 那么就说明 $i$ 含有质因数 $prime_j$

    因此, $varphi(i imes prime_j)=prime_j imes varphi(i)$

    否则,说明不含

    则 $varphi(i imes prime_j)=varphi(prime_j) imes varphi(i)$

    倘若 $prime_j > pf_i$ 那么,数 $i imes prime_j$ 将被数 ${i imes prime_j over pf_i}$ 筛到,这里可以直接开始跳出

    最后,注意质数表的大小和 $i imes prime_j$ 的大小

    我就是这个地方被卡了好多次......


  • 相关阅读:
    MOSS中的WebPart开发
    坚持学习WF(8):本地服务之调用外部方法
    坚持学习WF(9):本地服务之事件处理
    MOSS中如何自定义WebService
    uHub 0.4.1 发布,ADC 网络枢纽
    电商网站的宕机案例分析
    JID 2.0.1 发布,高性能的 Java 序列化库
    YaCy 1.2 发布,基于P2P的分布式Web搜索引擎
    Notepad++ 6.2.0 正式版
    Windows上 IE10 最快,Mac上Chrome 19最快
  • 原文地址:https://www.cnblogs.com/Dxy0310/p/9818263.html
Copyright © 2011-2022 走看看