数论例题选讲
标签:
题目一:[[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} d\varphi(n/d)\]
题目六:[[JSOI2008]球形空间产生器]
(http://www.lydsy.com/JudgeOnline/problem.php?id=1013)
高斯消元水题。
题目七:[[HNOI2017]礼物]
(https://www.luogu.org/problemnew/show/3723)
比较板的一道题。
转换题目意思,相当于求一个\(k\in[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)为\sum\sum ij(gcd(i,j)==d)\)
那么\(F(d)为\sum\sum ij(d|gcd(i,j))\)
由莫比乌斯反演定理可知,\(f(i)=\sum \mu(d/i)F(d)\)。
\[\begin{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 \rfloor \lfloor \frac mv \rfloor\]
接下来就很容易了,只需要对函数
\[f(d)={\sum_{u=1}^n \sum_{v=1}^m}[gcd(u,v)==d]\lfloor \frac nu \rfloor \lfloor \frac mv \rfloor\]
莫比乌斯反演即可,笔者在这里不再赘述。
题目十四:[[bzoj4816][Sdoi2017]数字表格]
(http://www.lydsy.com/JudgeOnline/problem.php?id=4816)
套路自然是先提出公因数。
\[\prod_d f(d)^{\sum\mu(i)[n/(id)][m/(id)]}\]
为了写的简便设\(p=id\),即
\[\prod_d f(d)^{\sum\mu(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+T\sqrt 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}^n\sum_{d|i}\varphi(d)=\sum_{{i \over d}=1}^n\sum_{d=1}^{n \over {i \over d}}\varphi(d) =\sum_{i=1}^n \phi({n\over i}) \\ \phi(n)={n(n+1)\over 2}-\sum_{i=2}^n\phi(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}^n\sum_{j=1}^nd(ij)=\sum_{i=1}^n\sum_{j=1}^n \sum_{x|i}\sum_{y|j}[gcd(x,y)==1]{xj \over y} \\=\sum_{p=1}^n\mu(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}^n\mu(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}^n\mu(p) \sum_{x=1}^{n \over p} {x}\lfloor {n \over px} \rfloor \sum_{y=1}^{n \over p} {{n \over py}({n \over py}+1) \over 2} \]
因为\[\sum_{i=1}^n i\lfloor{n \over i}\rfloor=\sum_{i=1}^n\sigma_1(i) \\\sum_{i=1}^n{ {n \over i}({n \over i}+1) \over 2}=\sum_{i=1}^n\sum_{j=1}^{n \over i}j=\sum_{j=1}^nj \lfloor {n \over j} \rfloor=\sum_{i=1}^n\sigma_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}^n\sum_{i=1}^{n \over d}\sum_{j=1}^{n \over d}[gcd(i,j)==1][ijd<=n] \\ =\sum_{d=1}^n\sum_{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} {\rm d} x = \sqrt n \int {{\rm 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} {\rm d}x =n^{\frac 23} \int { {\rm 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} {\rm 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}^n\sum_{i=1}^{n \over d}[gcd(i,{n \over d})==1]i={{1+\sum_{d|n}d\varphi(d)} \over 2} \]
\[\sum_{i=1}^n\sum_{d|i}d\varphi(d)=\sum_{i=1}^n\sum_{d=1}^{n \over i}d\varphi(d) \]
对函数\(f(d)=d\varphi(d)\),构造函数\(g(d)=d\)
有\[\sum_{i=1}^n(f*g)(i)=\sum_{i=1}^ni^2=\sum_{i=1}^n\sum_{d|i}f(d)g({i \over d})=\sum_{i=1}^ng(i) \sum_{d=1}^{n \over i}f(d)\]
然后杜教筛即可。