数论学习笔记

来源:互联网 发布:监控提示无网络视频 编辑:程序博客网 时间:2024/05/29 10:26

唉我数论太差了, 一直都是学的多,记住的少,真的用到的时候各种都不会。

作此笔记,希望有所提高!


积性函数:

对于积性函数:要掌握欧拉函数和莫比乌斯函数

如何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=1nj=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=1nj=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=1dnj=1dm[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=1dnj=1dmti,tjμ(t)=d=1nF(d)×i=1dnμ(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×tGμ(t)×F(tG) 然后我们设g(x)=\sum_{t|x}\mu\left(t\right)\times F\left(\frac{x}{t}\right)g(x)=txμ(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/













0 0
原创粉丝点击