唉我数论太差了, 一直都是学的多,记住的少,真的用到的时候各种都不会。
作此笔记,希望有所提高!
积性函数:
对于积性函数:要掌握欧拉函数和莫比乌斯函数
如何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(x),当且仅当x为完全平方数时函数值为1,否则函数值为0。那么
Ans=∑i=1n∑j=1mF(gcd(i,j)) 设d=gcd(i,j),那么
Ans=∑i=1n∑j=1mF(d)。 然后我们推一下这个式子:
Ans=∑d=1nF(d)×∑i=1⌊dn⌋∑j=1⌊dm⌋[gcd(i,j)=1]
=∑d=1nF(d)×∑i=1⌊dn⌋∑j=1⌊dm⌋∑t∣i,t∣jμ(t)=∑d=1nF(d)×∑i=1⌊dn⌋μ(t)×⌊dtn⌋×⌊dtm⌋ 然后我们设G=dt,则Ans=∑G=1n(t)×⌊Gn⌋×⌊Gm⌋×∑t∣Gμ(t)×F(tG) 然后我们设g(x)=∑t∣xμ(t)×F(tx),则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/