zoukankan      html  css  js  c++  java
  • 积性函数相关学习笔记

    线性筛

    也就是我。

    首先在埃氏筛里面我们是对于每个素数筛一遍,因此复杂度是 (O(nloglog n)) 的。

    然后线性筛我们对所有数都筛一遍。注意到每个合数 (n) 都有最小质因数 (x),我们就让它在被 (frac{n}{x}) 筛掉。

    反向考虑,不难发现 (n) 能且只能乘一个不超过自身最小质因数的数去筛。

    这个线性筛是非常优美的,我们可以发现每个数刚好只被筛了一次,所以复杂度显然为 (O(n))

    每个数只被筛一次是一个非常优美的性质,我们显然可以用它来搞点事情。

    整除分块

    [sum f(i)g(lfloorfrac{n}{i} floor) ]

    这个式子在我们知道快速求 (f,g) 任意一个的前缀和时可以 (O(sqrt n)) 搞定。

    不难发现 (i=[1,sqrt n]) 的时候 (lfloorfrac{n}{i} floor) 只有 (sqrt n) 个取值。

    不难发现 (i>sqrt n)(lfloorfrac{n}{i} floor<sqrt n),因此也只有 (sqrt n) 个取值。

    综上,(i)(lfloorfrac{n}{i} floor) 都只有 (sqrt n) 个取值,枚举一个取值的时候显然能得到另外一个取值的区间。

    莫比乌斯函数

    (n) 的莫比乌斯函数为 (mu(n))

    如果 (n) 有平方因子,则 (mu(n)=0)

    如果 (n) 没有平方因子,设 (n)(t) 个质因子,则 (mu(n)=(-1)^t)

    我们显然可以使用线性筛筛 (mu(n)),也可以在 (O(sqrt n)) 的复杂度内计算单个 (mu(n))

    欧拉函数

    (n) 的欧拉函数为 (varphi(n))

    (varphi(n)) 等于小于等于 (n) 且与 (n) 互质的整数个数。

    (n) 的唯一分解为 (prod p_i^{k_i}),则 (varphi(n)=nprod(1-p_i))

    我们显然可以使用线性筛筛 (varphi(n)),也可以在 (O(sqrt n)) 的复杂度内计算单个 (varphi(n))

    例1 P2398

    [Ans=sum_{i=1}^nsum_{j=1}^ngcd(i,j) ]

    展开 $$Ans=sum_{d=1}^ndsum_{i=1}^nsum_{j=1}^n[gcd(i,j)=d]$$ $$Ans=sum_{d=1}^ndsum_{i=1}^{frac{n}{d}}sum_{j=1}^{frac{n}{d}}[gcd(i,j)=1]$$ $$F(n)=sum_{i=1}^nsum_{j=1}^n[gcd(i,j)=1]$$ $$F(n)=2sum_{i=1}^nsum_{j=1}^{i}[gcd(i,j)=1]-1$$ $$F(n)=2sum_{i=1}^nvarphi(i)-1$$ $$Ans=sum_{d=1}^ndF(lfloorfrac{n}{d} floor)$$ 于是预处理 $O(n)$ 可以做到 $O(1)$ 算 $F(n)$。

    一个性质

    [sum_{d|n}mu(d)=[n=1] ]

    显然我们把这个东西单独拎出来肯定是有用的,因此记住它。

    数论函数

    定义域 (=mathbb{Z}^+),值域 (inmathbb{C}) 的函数就是数论函数。

    积性函数

    积性函数都是数论函数

    对于任意 (gcd(n,m)=1) 都有 (f(nm)=f(n)f(m)) 的数论函数称为积性函数。

    常见的积性函数有以下几种:

    • (varphi(n)),欧拉函数。
    • (mu(n)),莫比乌斯函数。
    • (d(n)),因数个数函数。
    • (sigma(n)),因数和函数。

    积性函数基本都可以通过线性筛来 (O(n)) 预处理。

    对于任意正整数 (n,m) 都有 (f(nm)=f(n)f(m)) 的数论函数称为完全积性函数。

    常见的完全积性函数有以下几种:

    • (epsilon(n)),元函数,(epsilon(n)=[n=1])
    • (I(n)),恒等函数,(I(n)=1)
    • (id(n)),单位函数,(id(n)=n)

    狄利克雷卷积

    和生成函数一样,两个数论函数也可以卷积。

    [(f*g)(n)=sum_{ij=n}f(i)g(j) ]

    于是有一些很显然的性质。

    • (f*g=g*f),交换律。
    • ((f*g)*h=f*(g*h)),结合律。
    • ((f+g)*h=f*h+g*h),分配律。
    • (f*epsilon=f)
    • (mu*I=epsilon),也就是上面的“一个性质”。
    • (mu*id=varphi)
    • (varphi*I=id)

    莫比乌斯反演

    这是第一个难点。

    先说结论。

    [F(n)=sum_{d|n}f(d)iff f(n)=sum_{d|n}mu(frac{n}{d})F(d) ]

    为什么呢?

    [F=f*I ]

    [F*mu=f*(mu*I) ]

    [F*mu=f*epsilon ]

    [F*mu=f ]

    然后我们转置反演矩阵(此部分待补充)可以得到另一种形式。

    [F(n)=sum_{n|d}f(d)iff f(n)=sum_{n|d}mu(frac{d}{n})F(d) ]

    例2 P3455

    [sum_{i=1}^asum_{j=1}^b[gcd(i,j)=d] ]

    展开 记 $n=frac{a}{d}$,$m=frac{b}{d}$。 $$Ans=sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=1]$$ $$Ans=sum_{i=1}^{n}sum_{j=1}^{m}sum_{d|gcd(i,j)}mu(d)$$ $$Ans=sum_{d=1}^{n}mu(d)lfloorfrac{n}{d} floorlfloorfrac{m}{d} floor$$

    例3 P6810

    [Ans=sum_{i=1}^nsum_{j=1}^md(i)d(j)d(gcd(i,j)) ]

    展开 $$Ans=sum_{t=1}^{min(n,m)}d(t)sum_{i=1}^{frac{n}{t}}sum_{j=1}^{frac{m}{t}}d(it)d(jt)[gcd(i,j)=1]$$ $$Ans=sum_{t=1}^{min(n,m)}d(t)sum_{i=1}^{frac{n}{t}}sum_{j=1}^{frac{m}{t}}d(it)d(jt)sum_{k|gcd(i,j)}mu(k)$$ $$Ans=sum_{t=1}^{min(n,m)}d(t)sum_{k}sum_{i=1}^{frac{n}{tk}}sum_{j=1}^{frac{m}{tk}}d(itk)d(jtk)$$ $$Ans=sum_{T=1}^{min(n,m)}sum_{t|T}d(t)mu(frac{T}{t})sum_{i=1}^{frac{n}{T}}sum_{j=1}^{frac{m}{T}}d(iT)d(jT)$$ $$Ans=sum_{T=1}^{min(n,m)}sum_{i=1}^{frac{n}{T}}sum_{j=1}^{frac{m}{T}}d(iT)d(jT)$$

    例4

    [Ans=sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)in P] ]

    有多组询问。

    展开 $$Ans=sum_{din P}sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=d]$$ $$f(d)=sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=d]$$ $$F(d)=sum_{i=1}^{n}sum_{j=1}^{m}[d|gcd(i,j)]=lfloorfrac{n}{d} floorlfloorfrac{m}{d} floor$$ $$F(n)=sum_{n|d}f(d)$$ $$f(n)=sum_{n|d}mu(frac{d}{n})F(d)$$ $$Ans=sum_{din P}sum_{d|t}mu(frac{t}{d})lfloorfrac{n}{t} floorlfloorfrac{m}{t} floor$$ $$Ans=sum_{t=1}^nlfloorfrac{n}{t} floorlfloorfrac{m}{t} floorsum_{d|t,din P}mu(frac{t}{d})$$

    例5

    [Ans=sum_{i=1}^{n}sum_{j=1}^{m} ext{lcm}(i,j) ]

    有多组询问。

    展开 $$Ans=sum_{i=1}^{n}sum_{j=1}^{m}frac{ij}{gcd(i,j)}$$ $$Ans=sum_{d=1}^nfrac{1}{d}sum_{i=1}^{n}sum_{j=1}^{m}ij[gcd(i,j)=d]$$ $$Ans=sum_{d=1}^ndsum_{i=1}^{frac{n}{d}}sum_{j=1}^{frac{m}{d}}ij[gcd(i,j)=1]$$ $$F(n,m)=sum_{i=1}^nsum_{j=1}^mij[gcd(i,j)=1]$$ $$F(n,m)=sum_{i=1}^nsum_{j=1}^mijsum_{d|gcd(i,j)}mu(d)$$ $$F(n,m)=sum_{d=1}^{min(n,m)}mu(d)d^2sum_{i=1}^{frac{n}{d}}isum_{i=1}^{frac{m}{d}}j$$ $$F(n,m)=sum_{d=1}^{min(n,m)}mu(d)d^2S(frac{n}{d})S(frac{m}{d})$$ $$Ans=sum_{d=1}^ndF(frac{n}{d},frac{m}{d})$$ $$Ans=sum_{t=1}^ntsum_{d=1}^{min(frac{n}{t},frac{m}{t})}mu(d)d^2S(frac{n}{dt})S(frac{m}{dt})$$ $$Ans=sum_{T=1}^{min(n,m)}S(frac{n}{T})S(frac{m}{T})Tsum_{d|T}mu(d)d$$ $f(n)=sumlimits_{d|n}mu(d)d$ 是个积性函数,因此我们可以线性筛。

    例6 AT5200

    [Ans=sum_{i=1}sum_{j=1}frac{c_ic_j}{gcd(i,j)} ]

    展开 $$Ans=sum_{d=1}frac{1}{d}sum_{i=1}sum_{j=1}c_{i}c_{j}[gcd(i,j)=d]$$ $$Ans=sum_{d=1}frac{1}{d}sum_{i=1}sum_{j=1}c_{id}c_{jd}[gcd(i,j)=1]$$ $$F(k)=sum_{i=1}sum_{j=1}c_{ik}c_{jk}[gcd(i,j)=1]$$ $$F(k)=sum_{i=1}sum_{j=1}c_{ik}c_{jk}sum_{d|gcd(i,j)}mu(d)$$ $$F(k)=sum_{d=1}mu(d)(sum_{i=1}c_{idk})^2$$

    例7 P3312

    [Ans=sum_{i=1}^nsum_{j=1}^m[sigma(gcd(i,j)leq a]sigma(gcd(i,j)) ]

    有多组询问。

    展开 $$sigma'(d)=egin{cases}sigma(d)&(dleq a)\ 0&(d>a)end{cases}$$ $$sum_{d=1}sigma'(d)sum_{i=1}^nsum_{j=1}^m[gcd(i,j)=d]$$ $$sum_{d=1}sigma'(d)sum_{i=1}^{frac{n}{d}}sum_{j=1}^{frac{m}{d}}sum_{t|gcd(i,j)}mu(t)$$ $$sum_{t=1}^{min(n,m)}mu(t)sum_{d=1}sigma'(d)sum_{i=1}^{frac{n}{dt}}sum_{j=1}^{frac{m}{dt}}1$$ $$sum_{T=1}^{min(n,m)}lfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsum_{t|T}mu(t)sigma'(frac{T}{t})$$ 大力离线询问维护 $sumlimits_{t|T}mu(t)sigma'(frac{T}{t})$ 就可以做到 $O(nlog^2n+qsqrt nlog n)$ 了。

    例8 P3704

    [prod_{i=1}^nprod_{j=1}^mf_{gcd(i,j)} ]

    有多组询问。

    展开 $$F(x)=sum_{i=1}^nsum_{j=1}^m[gcd(i,j)=x]$$ $$Ans=prod_{i=1}^{min(n,m)}f_{i}^{F(i)}$$ $$F(x)=sum_{i=1}^{min(frac{n}{x},frac{m}{x})}mu(i)lfloorfrac{n}{ix} floorlfloorfrac{m}{ix} floor$$ $$Ans=prod_{T=1}^{min(n,m)}prod_{i|T}f_i^{mu(frac{T}{i})lfloorfrac{n}{T} floorlfloorfrac{m}{T} floor}$$ $$Ans=prod_{T=1}^{min(n,m)}(prod_{i|T}f_i^{mu(frac{T}{i})})^{lfloorfrac{n}{T} floorlfloorfrac{m}{T} floor}$$

    例9 P6156

    [sum_{i=1}^nsum_{j=1}^n(i+j)^kmu(gcd(i,j))^2gcd(i,j) ]

    展开 $$sum_{d=1}d^{k+1}mu(d)^2sum_{i=1}^frac{n}{d}sum_{j=1}^frac{n}{d}(i+j)^k[gcd(i,j)=1]$$ $$sum_{d=1}d^{k+1}mu(d)^2sum_{i=1}^frac{n}{d}sum_{j=1}^frac{n}{d}(i+j)^ksum_{t|gcd(i,j)}mu(t)$$ $$sum_{d=1}d^{k+1}mu(d)^2sum_{t=1}mu(t)t^ksum_{i=1}^frac{n}{dt}sum_{j=1}^frac{n}{dt}(i+j)^k$$ $$sum_{T=1}T^ksum_{d|T}dmu(d)^2mu(frac{T}{d})sum_{i=1}^frac{n}{T}sum_{j=1}^frac{n}{T}(i+j)^k$$ $sumlimits_{d|T}dmu(d)^2mu(frac{T}{d})$ 是个积性函数,显然可以线性筛。 $T^k$ 是个积性函数,显然也可以线性筛。 $$sum_{i=1}^{n}sum_{j=1}^{n}(i+j)^k-sum_{i=1}^{n-1}sum_{j=1}^{n-1}(i+j)^k=2sum_{i=1}^{n-1}(i+n)^k+(2n)^k$$ 因此也可以递推,这道题就做完了。

    杜教筛

    对于一些积性函数 (f(x)),我们可以使用杜教筛在 (O(n^{frac{2}{3}})) 的复杂度内求前缀和。

    [F(n)=sum_{i=1}^nf(i) ]

    [f*g=h ]

    [sum_{i=1}^{n}h(i)=sum_{i=1}^nsum_{d|i}g(d)f(frac{i}{d}) ]

    [sum_{i=1}^{n}h(i)=sum_{d=1}^ng(d)F(frac{n}{d}) ]

    [sum_{i=1}^{n}h(i)=g(1)F(n)+sum_{d=2}^ng(d)F(frac{n}{d}) ]

    [g(1)F(n)=sum_{i=1}^{n}h(i)-sum_{d=2}^ng(d)F(frac{n}{d}) ]

    如果我们能在 (O(1)) 的时间内求出 (h(i)) 的前缀和,并处理出 (n^{frac{2}{3}}) 以内的 (F(i)),整体算法复杂度为 (O(n^{frac{2}{3}}))

    杜教筛使用的唯一前提就是你能找到一个很优美的 (g)

    min_25筛

    一些记号

    对于所有 (f(p)) 可以用一个多项式表示,且 (f(p^k)) 可以快速计算的积性函数 (f(x)),我们可以使用min_25筛在 (O(frac{n^{frac{3}{4}}}{log n}+n^{1-epsilon})) 的复杂度内求在 (frac{n}{d}) 处的前缀和。

    由于我太菜了不会证复杂度,上面那坨东西可以大概理解为能跑 (10^{11})

    首先,我们新定义一个完全积性函数 (g(x)),其在 (xin P) 处值为 (g(x))

    下文中,我们记 (P_j) 为第 (j) 个质数,(min(n)) 为一个数的最小质因数。不难注意到 (min(n)leqsqrt n)

    第一步

    [G_{i,j}=sum_{k=2}^i[iin P ext{ or }min(i)>P_j]g(k)\ G_{i,0}=sum_{k=2}^ig(k)\ G_{i,j}=G_{i,j-1}-sum_{k=2}^i[i otin P ext{ and }min(k)=P_{j}]g(k)\ G_{i,j}=G_{i,j-1}-g(P_j)(sum_{k=2}^frac{i}{P_{j}}[min(k)geq P_{j}]g(k))\ G_{i,j}=G_{i,j-1}-g(P_j)(G_{frac{i}{P_j},j-1}-sum_{k=2}^{P_{j-1}}[iin P]g(k))\ ]

    显然 (sumlimits_{i=1}^n[iin P]f(i)=G_{n,k}),其中 (k)(sqrt n) 内质数个数。

    第二步

    [F_{i,j}=sum_{k=2}^i[min(i)>P_j]f(k)\ F_{i,k}=G_{i,k}\ F_{i,j}=sum_{k=P_{j+1}}^i[iin P ext]f(k)+sum_{t=j+1}sum_{k=2}^i[i otin P ext{ and }min(i)=P_t]f(k)\ F_{i,j}=sum_{k=P_{j+1}}^i[iin P ext]f(k)+sum_{t=j+1}sum_{e=1}f(P_t^e)sum_{k=2}^{frac{n}{P_t^e}}[min(i)>P_t]f(k)\ ]

    显然 (F_{n,0}) 即为所求。

  • 相关阅读:
    python django 创建app失败 升级sqlite3 或者修改数据库连接为mysql
    Decima json 化
    openpyxl excel操作
    centos添加python虚拟环境
    oracle的参数文件:pfile和spfile
    修改 db_unique_name
    工具 --- Vim
    部署 --- Nginx
    工具 --- Git使用
    django 之(五) --- RESTApi总结
  • 原文地址:https://www.cnblogs.com/dead-X/p/14759164.html
Copyright © 2011-2022 走看看