浅谈OI中的数论
Posted valentino
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈OI中的数论相关的知识,希望对你有一定的参考价值。
事情是这样的,我是一个萌新,然后萌新初学数论。qvq
本篇文章的难度大概是gcd~莫比乌斯反演,说不定我还会写一点组合计数,容斥原理,线性代数的知识,当然,我估计我不会,因为咕咕。
文章以数学证明为主,代码都好理解,所有的运算以计算机运算法则为准。qvq(人家的码风才不毒瘤)
GCD&LCM
即最大公约数和最小公倍数,这里介绍欧几里得求gcd。
设(a,b)表示gcd(a,b)。
求证:gcd(a,b)=gcd(b,a%b)
证明:
设a=k1*c,b=k2*c且(k1,k2)=1.
则(a,b)=c.
设k3=a/b(按照计算机运算法则,向下取整)
则a%b=a-k3*b.
则有a%b=a-k3*b=k1*c-k3*k2*c=(k1-k2*k3)*c.
若(k2,k1-k2*k3)=1,(b,a%b)=c,则(a,b)=(b,b%a).
若(k2,k1-k2*k3)≠1,设k2=m1*d,k1-k2*k3=m2*d.
则(a,b)=(k3*m1*d*c+m2*d*c,m1*d*c)=dc≠c,则假设不成立。
综上所述,(a,b)=(b,a%b).
证毕.
特别地,当b=0的时候,(a,b)=a。
LCM的求法:lcm(a,b)=a*b/gcd(a,b).就不证明了。
代码:
#include<cstdio> int a,b; int gcd(int a,int b) { return (b==0)?a:gcd(b,a%b); } int lcm(int a,int b) { return a*b/gcd(a,b); } int main() { scanf("%d%d",&a,&b); printf("GCD=%d LCM=%d ",gcd(a,b),lcm(a,b)); return 0; }
以上是关于浅谈OI中的数论的主要内容,如果未能解决你的问题,请参考以下文章
《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
《算法竞赛中的初等数论》正文 0x60 原根(ACM / OI / MO)(二十万字符数论书)