唉我数论太差了, 一直都是学的多,记住的少,真的用到的时候各种都不会。
作此笔记,希望有所提高!
积性函数:
对于积性函数:要掌握欧拉函数和莫比乌斯函数
如何f=gh,g,h是积性函数,f也是积性函数。
一般积性函数f(ab)=f(a)f(b),a和b互质
欧拉函数:
1. sigma(euler(d))=n (d|n)
2. n>1时,1到n中与n互质的整数和为n*euler(n)/2
莫比乌斯函数:
推荐巨巨博客:http://blog.csdn.net/acdreamers/article/details/8542292
巨巨论文:http://wenku.baidu.com/view/542961fdba0d4a7302763ad5.html
莫比乌斯反演 :公式不列了,这个图片一直显示不出来啊
重要性质: sigma(u(d)) =[n=1] (d|n)
u(d)=1, d=1;
u(d)=(-1)^k, d=p1*p2*p3*...*pk
u(d)=0,else
例题1: 求sigma(gcd(i,j)),1<=i<=n, 1<=j<=m;
ps. 虽然这会看懂了,但是一直会忘记,这里主要用到了n=sigma(euler(d)) (d|n) 这个式子化简,把gcd(i,j)看成n
例题2: 求gcd(i,j)=1的个数,1<=i<=n,1<=j<=n
ps.这题用到的化简结论是[n=1] = sigma(u(d)) (d|n) ,同理上题
结论总结:一定要牢记莫比乌斯函数和欧拉函数的两个等式: sigma(euler(d)) = n (d|n) and sigma(u(d)) = [n=1] (d|n)
来点题目把
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105406#problem/B (莫比乌斯反演求解gcd(i,j)=d的模板题)
题目很基础,就是先线性筛处理莫比乌斯函数,然后求u的前缀和,然后把d提出来,就变成求gcd(i,j)=1的个数了,通过上面的化简就是求sigma(u(d)*(n/d)*(m/d)),然后就是用O(sqrt(n))的复杂度枚举d就行了,这个枚举可以做成模板
int bb=min(b,d); for(int i=1;i<=bb;){ int x=b/(b/i); int y=d/(d/i); int z=min(x,y); //cout<<z<<endl; ans+=(LL)(sum[z]-sum[i-1])*(b/i)*(d/i); i=z+1; }
这是枚举gcd(i,j)=1的个数ans,1<=i<=n,1<=j<=m,如果题目要求(1,2)和(2,1)算同一种的话,还需要求出1<=i<=min(n,m),1<=j<=min(n,m)之间的满足条件的个数ret,
然后ans-=ret/2就是不重复的对数了
AC代码:http://paste.ubuntu.net/15907415/
再来一个bc碰到的题
http://acm.hdu.edu.cn/showproblem.php?pid=5663 (反演求gcd(i,j)=完全平方数的个数)
这题如果直接枚举完全平方数,复杂度就退化到O(Tn)了,由于T很大,就T了
所以需要一些计算化简。
那么我们设函数F\left(x\right)F(x),当且仅当xx为完全平方数时函数值为1,否则函数值为0。那么
Ans=\sum_{i=1}^n\sum_{j=1}^mF\left(\gcd\left(i,j\right)\right)Ans=∑i=1n∑j=1mF(gcd(i,j)) 设d=\gcd\left(i,j\right)d=gcd(i,j),那么
Ans=\sum_{i=1}^n\sum_{j=1}^mF\left(d\right)Ans=∑i=1n∑j=1mF(d)。 然后我们推一下这个式子:
Ans=\sum_{d=1}^nF\left(d\right)\times\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\left[\gcd\left(i,j\right)=1\right]Ans=∑d=1nF(d)×∑i=1⌊dn⌋∑j=1⌊dm⌋[gcd(i,j)=1]
=\sum_{d=1}^nF\left(d\right)\times\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\sum_{t|i,t|j}\mu\left(t\right) =\sum_{d=1}^nF\left(d\right)\times\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu\left(t\right)\times\lfloor\frac{n}{dt}\rfloor\times\lfloor\frac{m}{dt}\rfloor=∑d=1nF(d)×∑i=1⌊dn⌋∑j=1⌊dm⌋∑t∣i,t∣jμ(t)=∑d=1nF(d)×∑i=1⌊dn⌋μ(t)×⌊dtn⌋×⌊dtm⌋ 然后我们设G=dtG=dt,则Ans=\sum_{G=1}^n\left(t\right)\times\lfloor\frac{n}{G}\rfloor\times\lfloor\frac{m}{G}\rfloor\times\sum_{t|G}\mu\left(t\right)\times F\left(\frac{G}{t}\right)Ans=∑G=1n(t)×⌊Gn⌋×⌊Gm⌋×∑t∣Gμ(t)×F(tG) 然后我们设g(x)=\sum_{t|x}\mu\left(t\right)\times F\left(\frac{x}{t}\right)g(x)=∑t∣xμ(t)×F(tx),则Ans=\sum_{G=1}^n\left(t\right)\times\lfloor\frac{n}{G}\rfloor\times\lfloor\frac{m}{G}\rfloor\times g(G)Ans=∑G=1n(t)×⌊Gn⌋×⌊Gm⌋×g(G)。
(t)是表示G是t的倍数,其实最后公式是Ans=sigma((n/G)*(m/G)*p[G]), p[G]=simga(u(G/d)) (d为完全平方数) ,p[G]函数用筛法枚举d即可得到,复杂度O(sqrt(n))
然后就是和前面一样的方法了。感觉我还是推的太渣了,各种不会推,是时候强行撸一波数论11题了,感谢本部的金牌爷梁爽学长教导
AC代码:http://paste.ubuntu.net/15907512/