zoukankan      html  css  js  c++  java
  • 数论例题选讲

    数论例题选讲

    标签:


    题目一:[[CQOI2007]余数求和]

    (https://www.luogu.org/problemnew/show/2261)
    一道比较套路的数论分块题目。

    题目二:[hdu2866][Special Prime]

    (https://vjudge.net/problem/HDU-2866)
    题意:在区间[2,L]内,有多少个素数p,满足方程(n^3+n^2p=m^3)有解。((l<=10^6))
    (n^2(n+p)),我们可以对n中含不含p质因子进行讨论。
    (p|n),那么设(n=ap).
    (a^3p^2(p+1)=m^3)很明显没有正整数解。
    所以(p不被n)整除,那么((n+p,n^2)=1)
    所以设(n+p=a^3,n^2=b^6,即n=b^3)
    (p=a^3-b^3=(a-b)(a^2+ab+b^2))
    所以(a-b=1),(p=(b+1)^3-b^3),
    枚举b即可。

    题目三:http://poj.openjudge.cn/practice/1046/

    题意:给定b,求最大的a,使(a(a+b)=m^2)有解,(b<=10^9,T<=10^3)
    与上题同样的套路。
    首先把a,b的最大公约数约掉,即默认((a',b')=1)
    那么((a',a'+b')=1),所以同样设(a'=x^2,a'+b'=y^2)
    (b'=y^2-x^2,b=d(y^2-x^2),a=dx^2)
    然后让(dx^2)大,就枚举d搞就行了。
    大约是(O(sqrt b))

    事实上,可以把b写成a的某种形式
    (a^2+ab=(a+t)^2)
    (ab=2at+t^2)
    (a=t^2/(b-2t))
    所以t肯定要尽量的大。
    当b为奇数,$ 2t=b-1 $
    当b为偶数,(4|b) ,$2t=b-4 $
    当b为偶数,b不为4的倍数, (2t= b-2)

    题目四:[[bzoj4403]序列统计]

    (http://www.lydsy.com/JudgeOnline/problem.php?id=4403)
    组合数学
    小学应该都学过吧.....插板法。
    (x=r-l+1)
    答案就是(sum_{i=1}^n C(i+x-1,x-1))
    有因为有恒等式(sum_{i=0}^n C(m+i,m)=C(m+n+1,m+1))
    所以答案为(C(n+x,x)-1)
    然后用Lucas定理。

    题目五:

    http://poj.org/problem?id=2480
    题意:求(sum_{i=1}^n gcd(i,n),n<=10^9)
    套路提公因数。

    [sum_{d|n} dvarphi(n/d) ]

    题目六:[[JSOI2008]球形空间产生器]

    (http://www.lydsy.com/JudgeOnline/problem.php?id=1013)
    高斯消元水题。

    题目七:[[HNOI2017]礼物]

    (https://www.luogu.org/problemnew/show/3723)
    比较板的一道题。
    转换题目意思,相当于求一个(kin[0,n-1]),使得

    [sum_{i=0}^{n-1} (a_i-b_{(i+k)\%n}+C)^2 ]

    展开,发现只与(sum a_ib_{i+k})有关。
    这个怎么求呢,如果把(b_i)倒过来,就是个卷积了。

    题目八:[[ZJOI2014]力]

    (https://www.luogu.org/problemnew/show/P3338)
    注意到(q_i×{[{1 over (j-i]}]}^2)可以变成一个卷积的形式。
    只需要设(p_{j-i}={[{1 over (j-i)}]}^2)即可。
    注意一下精度问题和(j-i< 0)时的问题。

    题目九:[[bzoj2440][中山市选2011]完全平方数]

    (http://www.lydsy.com/JudgeOnline/problem.php?id=2440)
    容斥原理的简单应用。

    二分之后就变成一个简单的容斥问题了。

    题目十[[bzoj4591]超能粒子炮改]:

    (http://www.lydsy.com/JudgeOnline/problem.php?id=4591)
    Lucas定理的基本应用。
    其实我的做法与网上的不太一样,而且有点复杂(bzoj上6s......)

    题目十一:[[bzoj2301][HAOI2011] Problem B]

    (http://www.lydsy.com/JudgeOnline/problem.php?id=2301)
    对于给出的n个询问,每次求有多少个数对(x,y)满足
    a≤x≤b,c≤y≤d且gcd(x,y)=k
    n,a,b,c,d,k<=5w;

    就跟二维前缀和一样,是很简单的容斥模型。

    题目十二:[[bzoj2154]Crash的数字表格]

    (http://www.lydsy.com/JudgeOnline/problem.php?id=2154)
    比较套路的莫比乌斯反演。

    首先设(f(d)为sumsum ij(gcd(i,j)==d))
    那么(F(d)为sumsum ij(d|gcd(i,j)))
    由莫比乌斯反演定理可知,(f(i)=sum mu(d/i)F(d))

    [egin{align} sum_{i=1}^n frac{f(i)}i & =sum_{i=1}^n frac{sum_{i|d}mu(d/i)F(d)}{i} \ & = sum_{i=1}^n F(i)sum_{d|i}frac{mu(i/d)}{d} \ & = sum_{i=1}^n F(i)frac{sum_{d|i} mu(d)d}{i} end{align}]

    然后只需要线性筛出 $ sum_{d|n} mu(d)d$就行了。
    顺便提一句,这个做法能够解决多组数据的情况,只需要前缀和一下就能数论分块做了。

    题目十三:[[bzoj3994][SDOI2015]约数个数和]

    (http://www.lydsy.com/JudgeOnline/problem.php?id=3994)
    很全面的一道莫比乌斯反演题目!
    这道题难想在一个定理,接下来的分析应该都是很自然的。

    [d(nm)=sum_{i|n}^n sum_{j|m}^m[gcd(i,j)==1] ]

    因为题目本身形式很难化成与gcd有关,强行提取gcd也没什么用。
    将题目形式转换为一个优美的式子

    [sum_{i=1}^n sum_{j=1}^m sum_{u|i}sum_{v|j}[gcd(u,v)==1] ]

    我们再对这个式子分析。
    由于u,v都分别是i,j的约数,所以各种优化都颇为不便。
    我们可以直接考虑每一组(u,v)做出的贡献。
    即转换为

    [{sum_{u=1}^n sum_{v=1}^m}[gcd(u,v)==1]lfloor frac nu floor lfloor frac mv floor]

    接下来就很容易了,只需要对函数

    [f(d)={sum_{u=1}^n sum_{v=1}^m}[gcd(u,v)==d]lfloor frac nu floor lfloor frac mv floor]

    莫比乌斯反演即可,笔者在这里不再赘述。

    题目十四:[[bzoj4816][Sdoi2017]数字表格]

    (http://www.lydsy.com/JudgeOnline/problem.php?id=4816)
    套路自然是先提出公因数。

    [prod_d f(d)^{summu(i)[n/(id)][m/(id)]} ]

    为了写的简便设(p=id),即

    [prod_d f(d)^{summu(p/d)[n/p][m/p]} ]

    看到(f和mu)的参数乘起来是p,是不是很舒服,那么我们就枚举p。

    [prod_p (prod_{d|p} f(d)^{mu(p/d)})^{[n/p][m/p]} ]

    那么我们只需要(O(nloglogn))就可以处理出(prod f(d)^{mu(p/d)}),然后舒服的进行前缀和分块优化。
    复杂度:(O(nloglogn+Tsqrt n log n))

    题目十五:[51nod 1239]欧拉函数之和

    (https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239)
    最基本的欧拉函数求前缀和。
    (phi(d)=sum_{i=1}^d varphi(i))

    [sum_{i=1}^ni=sum_{i=1}^nsum_{d|i}varphi(d)=sum_{{i over d}=1}^nsum_{d=1}^{n over {i over d}}varphi(d) =sum_{i=1}^n phi({nover i}) \ phi(n)={n(n+1)over 2}-sum_{i=2}^nphi(i)]

    然后杜教筛即可。

    题目十六:[51nod 1220 约数之和]

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1220
    这一题比之前的那个还要骚。

    记$sigma_{p}(x)=sum_{d|x}d^p $
    则$sigma_1(nm)=sum_{x|n}sum_{y|m}[gcd(x,y)==1]{xm over y} $
    证明什么的就唯一分解定理搞一搞就OK了。

    那么

    [sum_{i=1}^nsum_{j=1}^nd(ij)=sum_{i=1}^nsum_{j=1}^n sum_{x|i}sum_{y|j}[gcd(x,y)==1]{xj over y} \=sum_{p=1}^nmu(p) sum_{i=1}^{n}sum_{j=1}^{n} sum_{x|i}sum_{y|j}[p|gcd(x,y)]{xj over y} \=sum_{p=1}^nmu(p) sum_{i=1}^{n over p}sum_{j=1}^{n over p}sum_{x|i}sum_{y|j}{ xj over y} \ =sum_{p=1}^nmu(p) sum_{x=1}^{n over p} {x}lfloor {n over px} floor sum_{y=1}^{n over p} {{n over py}({n over py}+1) over 2} ]

    因为$$sum_{i=1}^n ilfloor{n over i} floor=sum_{i=1}^nsigma_1(i)
    \sum_{i=1}^n{ {n over i}({n over i}+1) over 2}=sum_{i=1}^nsum_{j=1}^{n over i}j=sum_{j=1}^nj lfloor {n over j} floor=sum_{i=1}^nsigma_1(i)

    [$$原式=sum_{p=1}^n mu(i)(sum_{i=1}^{p over i} sigma_1(i))^2]

    后面那个直接可以分块做,复杂度和杜教筛一样(需要线性筛出前(n^{frac 23})项)。
    前面这个直接杜教筛就可以了。

    题目十七:[51nod 1222]最小公倍数计数

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1222
    先算前缀和。(假设i,j是有序的)

    [sum_{i=1}^n sum_{j=1}^n [{ij over (i,j)}<=n] \ =sum_{d=1}^nsum_{i=1}^{n over d}sum_{j=1}^{n over d}[gcd(i,j)==1][ijd<=n] \ =sum_{d=1}^nsum_{p=1}^{n over d}mu(p)sum_{i=1}^{n over dp}sum_{j=1}^{n over dp}[ijd<={n over p^2}] \ =sum_{p=1}^n mu(p)sum_{d=1}^{n over p}sum_{i=1}^{n over dp} sum_{j=1}^{n over dp}[ijd<={n over p^2}] ]

    现在还是不能直接做,但是你会发现这里大多数限制条件都是非常松的。
    比如p可以从1枚举到n,可是(p^2>=n)时就对答案没有贡献了。
    d也只能枚举到(n over p^2),不过可以把i,j的限制改松一点

    [原式=sum_{p=1}^{sqrt n}mu(p)sum_{d=1}^{n over p^2}sum_{i=1}^{n over p^2} sum_{j=1}^{n over p^2}[ijd<={n over p^2}] ]

    这样就可以转换成一个三元组((x,y,z))之积小于等于({n over p^2})的问题了。
    我们强行令(x<=y<=z),那么最后我们求出(x< y< z),$x < y =z (, ) x=y < z$, $ x=y=z $ 的方案数,再乘个组合数就行了。
    求$ x < y < z $ 应该是最慢的,只需要x枚举到 $ n^{ frac 13 } $ ,y枚举到 $ sqrt {n over x}即可 $

    那么我们来分析一波复杂度,先看下算里面的这重循环。

    [sum_{x=1}^{n^{frac 13}} sqrt {n over x}-x ]

    这个复杂度不太好放缩,我们直接上积分。

    [int sqrt {n over x} { m d} x = sqrt n int {{ m d}x over sqrt x} = sqrt n (2 sqrt x +C) ]

    那么$$int_0^{n^{frac 13}} sqrt {n over x}=sqrt n(2 sqrt {n^{frac 13}})=2n^{frac 23}$$
    所以里面这个复杂度是(O(n^{frac 23}))的,再来分析一波外面的循环。

    [T(n)=sum_{p=1}^{n^{frac12}} O(({n over p^2})^{frac 23}) ]

    无论怎样放缩都是(O(n^{frac 56}))的。
    所以......还是来一波积分。

    [int ({n over x^2})^{frac 23} { m d}x =n^{frac 23} int { { m d}x over x^{frac 43}}=-3n^{frac 23}x^{-frac 13}]

    [T(n)=O(n^{frac 23})+O(int_1^{n^{frac 12}} ({n over x^2})^{frac 23} { m d}x) =O(n^{frac 23})]

    (因为x接近0时函数接近无穷,所以我把1的给加上了)
    实际上根本用不着这么麻烦。因为把n提出来后,复杂度大约是(n^{frac 23}sum_{x=1}^n {1 over x^{frac 43}}),而这个数列是收敛的,提供的值只会是一个不大的常数。
    所以正如网上所说的那样,这样做法的复杂度就是(O(n^{frac 23}))

    题目十八:[51nod 1227] 平均最小公倍数

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1227
    推一波式子。

    [A(n)={sum_{i=1}^n lcm(i,n) over n}=sum_{i=1}^n{in over gcd(i,n)n} =sum_{i=1}^n{i over gcd(i,n)} \=sum_{d|n}^nsum_{i=1}^{n over d}[gcd(i,{n over d})==1]i={{1+sum_{d|n}dvarphi(d)} over 2} ]

    [sum_{i=1}^nsum_{d|i}dvarphi(d)=sum_{i=1}^nsum_{d=1}^{n over i}dvarphi(d) ]

    对函数(f(d)=dvarphi(d)),构造函数(g(d)=d)
    有$$sum_{i=1}^n(f*g)(i)=sum_{i=1}^ni^2=sum_{i=1}^nsum_{d|i}f(d)g({i over d})=sum_{i=1}^ng(i) sum_{d=1}^{n over i}f(d)$$
    然后杜教筛即可。

  • 相关阅读:
    PHP压缩html网页代码 : 清除空格,制表符,注释标记
    CentOS 编译 Nginx 服务
    Fedora 下安装Fcitx输入法
    SVN 脚本
    Linux 在线播放
    Linux命令行下常用svn命令
    linux vi(vim)常用命令汇总
    MySQL修改root密码
    Fedora 查看CHM帮助文档
    Fedora 快捷键
  • 原文地址:https://www.cnblogs.com/gzy-cjoier/p/8206944.html
Copyright © 2011-2022 走看看