码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈OI中的数论

时间:2019-10-09 15:21:28      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:算法   组合   表示   数学   初学   soft   最大   print   一个   

  事情是这样的,我是一个萌新,然后萌新初学数论。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\n",gcd(a,b),lcm(a,b));
    return 0;
}

 

 

 

  

  

 

浅谈OI中的数论

标签:算法   组合   表示   数学   初学   soft   最大   print   一个   

原文地址:https://www.cnblogs.com/valentino/p/11641953.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!