zoukankan      html  css  js  c++  java
  • 数论大合集(柿子版)

    whx1003神仙blog
    这里主要是一些题目以及常见套路
    首先是莫比乌斯反演的柿子

    [f(n)=sum_{d|n}g(d)leftrightarrow g(n)=sum_{d|n}mu(frac nd)f(d)\ f(n)=sum_{n|d}g(d)leftrightarrow g(n)=sum_{n|d}mu(frac dn)f(d) ]

    其实用的最多的还是这个柿子

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

    更具体一点是这个东西

    [sum_{d|i,d|j}mu(d)=[gcd(i,j)=1] ]


    好了,那我们就开始吧
    首先莫比乌斯反演考察的不是公式本身,而是数学推导
    于是先从这里开始

    [sum_{i = 1}^n sum_{j = 1}^m sigma_0(i) sigma_0(j) sigma_0(gcd(i, j))\ n,mle 10^6 ]

    其中(sigma_0(n))表示(n)的约数个数
    我们可以做如下推导:

    [=sum_{i=1}^nsum_{j=1}^msigma_0(i)sigma_0(j)sum_{d|i,d|j}1\ =sum_{d=1}^{min(n,m)}(sum_{d|i}^nsigma_0(i))(sum_{d|j}^msigma_0(j)) ]

    第一步是根据定义,第二步是交换和式(这个东西多推推柿子就会了)
    然后我们可以枚举(d),后面的东西暴力统计一遍,时间复杂度为(mathcal O(nln n))


    好的,再来康康这道题

    [sum_{i=1}^nsum_{j=1}^n[gcd(i,j)=1]\ nle 2 imes 10^6 ]

    sol.

    [=sum_{i=1}^nsum_{j=1}^nsum_{d|i,d|j}mu(d)\ =sum_{d=1}^nmu(d)sum_{d|i}^nsum_{d|j}^n\ =sum_{d=1}^nmu(d)lfloor frac nd floor^2 ]

    枚举(d)就可以(mathcal O(n))计算了,如果整除分块可以做到(mathcal O(sqrt n))可以应付多组询问


    稍微变式

    [sum_{i=1}^nsum_{j=1}^ngcd(i,j)\ nle 2 imes 10^6 ]

    sol.

    [=sum_{i=1}^nsum_{j=1}^nsum_{d|i,d|j}varphi(d)\ =sum_{d=1}^nvarphi(d)sum_{d|i}^nsum_{d|j}^n\ =sum_{d=1}^nvarphi(d)lfloor frac nd floor^2 ]

    这里主要是用到了这个柿子

    [sum_{d|n}varphi(d)=n ]

    当然你也可以枚举(gcd)然后用莫反公式硬推,后面会有类似的做法
    小练习:1 2


    [sum_{i=1}^nsum_{j=1}^mlcm(i,j)\ n,mle 10^7 ]

    sol.

    [=sum_{i=1}^nsum_{j=1}^mfrac{ij}{gcd(i,j)}\ =sum_{d=1}^{min(n,m)}sum_{d|i}^nsum_{d|j}^mfrac{ij}d[gcd(i,j)=d]\ =sum_{d=1}^{min(n,m)}sum_{d|i}^nsum_{d|j}^mfrac{ij}d[gcd(frac id,frac jd)=1] ]

    不妨令(i`=frac id,j`=frac jd)
    那么

    [=sum_{d=1}^{min(n,m)}dsum_{i`=1}^{lfloor frac nd floor}sum_{j`=1}^{lfloor frac md floor}i`j`[gcd(i`,j`)=d]\ =sum_{d=1}^{min(n,m)}dsum_{i`=1}^{lfloor frac nd floor}sum_{j`=1}^{lfloor frac md floor}i`j`sum_{w|i`,w|j`}mu(w)\ =sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw} floor}mu(w)sum_{w|i`}^{lfloor frac nd floor}sum_{w|j`}^{lfloor frac md floor}i`j`\ =sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw} floor}mu(w)w^2sum_{i=1}^{lfloor frac n{dw} floor}sum_{j=1}^{lfloor frac m{dw} floor}ij\ =sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw} floor}mu(w)w^2(sum_{i=1}^{lfloor frac n{dw} floor}i)(sum_{j=1}^{lfloor frac m{dw} floor}j)\ ]

    不妨令(S(n)=sum_{i=1}^ni=frac {n(n+1)}2)
    那么

    [=sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw} floor}mu(w)w^2S(lfloorfrac n{dw} floor)S(lfloorfrac m{dw} floor)\ ]

    (T=dw),那么

    [=sum_{T=1}^{min(n,m)}sum_{d|T}dmu(frac Td)(frac Td)^2S(lfloor frac nT floor)S(lfloor frac mT floor) ]

    显然(sum_{d|T}dmu(frac Td)(frac Td)^2)是一个卷积的柿子,因此是积性的,可以用线性筛筛出
    然后后面就是一个整除分块的柿子,直接做就可以了


    来个稍微轻松一点的

    [sum_{i=1}^nsum_{j=1}^m[gcd(i,j)in P]\ 其中P表示所有质数的集合 ]

    sol.

    [=sum_{din P}sum_{d|i}^nsum_{d|j}^m[gcd(frac id,frac jd)=1]\ =sum_{din P}sum_{i=1}^{lfloor frac nd floor}sum_{j=1}^{lfloor frac md floor}[gcd(i,j)=1]\ =sum_{din P}sum_{i=1}^{lfloor frac nd floor}sum_{j=1}^{lfloor frac md floor}sum_{w|i,w|j}mu(w)\ =sum_{din P}sum_{w=1}mu(w)lfloor frac n{dw} floorlfloorfrac m{dw} floor ]

    (T=dw)

    [=sum_{T=1}lfloor frac nT floorlfloorfrac mT floorsum_{d|T,din P}mu(frac Td) ]

    前面整除分块,后面直接暴力
    但其实后面也可以线性筛(虽然它并不是积性函数)
    具体如何筛,这位大佬有详细讲解
    这个题目告诉我们线性筛不只能筛积性函数
    只要是能够快速递推求出当新加入一个最小素因子时的点值的数论函数都可以求解


    结论题

    [sum_{i=1}^nsum_{j=1}^md(ij) ]

    我们有结论

    [d(ij)=sum_{x|i}sum_{y|j}[gcd(x,y)=1] ]

    简单证明
    对于质数(p),不妨设(i)中有(p^a),(j)中有(p^b)
    现在考虑要选出(p^k(kin [0,a+b]))
    如果(kle a),则在(i)中选出,对应到((x,y))则为((p^a,1))
    否则我们强制选满(i)中的(p),在(j)中选(p^{k-a}),对应到((x,y))则为((p^{a-min(a,k-a)},p^{k-a-min(a,k-a)}))
    对于每一个质数都如是考虑,显然成立
    于是

    [=sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|i}[gcd(x,y)=1]\ =sum_{x=1}^nsum_{y=1}^m[gcd(x,y)=1]sum_{x|i}sum_{y|i}1\ =sum_{x=1}^nsum_{y=1}^mlfloorfrac nx floorlfloorfrac my floor[gcd(x,y)=1]\ =sum_{x=1}^nsum_{y=1}^mlfloorfrac nx floorlfloorfrac my floorsum_{d|x,d|y}mu(d)\ =sum_{d=1}^{min(n,m)}mu(d)sum_{d|x}lfloorfrac nx floorsum_{d|y}lfloorfrac my floor\ =sum_{d=1}^{min(n,m)}mu(d)sum_{i=1}^{lfloorfrac nd floor}lfloorfrac n{di} floorsum_{j=1}^{lfloorfrac md floor}lfloorfrac m{di} floor\ =sum_{d=1}^{min(n,m)}mu(d)sum_{i=1}^{lfloorfrac nd floor}lfloorfrac{lfloorfrac nd floor}i floorsum_{j=1}^{lfloorfrac md floor}lfloorfrac{lfloorfrac md floor}j floor ]

    不妨设(f(p)=sum_{i=1}^plfloorfrac pi floor),那么

    [=sum_{d=1}^{min(n,m)}mu(d)f(lfloorfrac nd floor)f(lfloorfrac md floor) ]

    显然(f)可以整除分块预处理,这个柿子本身也可以整除分块,那么此题就结束了


    莫反最后一题

    [sum_{i=1}^nsum_{j=1}^m[sigma_1(gcd(i,j))le a]sigma_1(gcd(i,j)) ]

    (2 imes 10^4)组询问,每次(a)重新给定,(n,mle 10^5)
    sol.

    [=sum_{d=1}^{min(n,m)}sum_{d|i}^nsum_{d|j}^m[gcd(frac id,frac jd)=1][sigma_1(d)le a]sigma_1(d)\ =sum_{d=1}^{min(n,m)}[sigma_1(d)le a]sigma_1(d)sum_{i=1}^{lfloorfrac nd floor}sum_{j=1}^{lfloorfrac md floor}sum_{w|i,w|j}mu(w)\ =sum_{d=1}^{min(n,m)}[sigma_1(d)le a]sigma_1(d)sum_{w=1}mu(w)lfloorfrac n{dw} floorlfloorfrac m{dw} floor\ =sum_{T=1}^{min(n,m)}lfloorfrac nT floorlfloorfrac mT floorsum_{d|T}[sigma_1(d)le a]sigma_1(d)mu(frac Td)\ ]

    (g(T)=sum_{d|T}[sigma_1(d)le a]sigma_1(d)mu(frac Td))
    可以发现只有(sigma_1(d)le a)(sigma_1(d)mu(frac Td))才会对(g(T))产生贡献
    于是可以将所有的询问离线下来后按照(a)进行排序
    然后当(a)增大时,我们就枚举倍数依次加入这些贡献
    于是需要一个支持单点修改区间查询(因为整除分块需要)的数据结构,树状数组是一个不错的选择

  • 相关阅读:
    结构化分析工具之判定树
    结构化分析工具之判定表
    结构化分析工具之结构化语言
    结构化分析工具之数据字典
    结构化分析工具之数据流图
    结构化分析方法
    软件生存周期模型之V模型
    软件生存周期模型之喷泉模型
    软件生存周期模型之螺旋模型
    软件生存周期模型之原型模型
  • 原文地址:https://www.cnblogs.com/zmyzmy/p/14005993.html
Copyright © 2011-2022 走看看