最大公约数

欧几里得算法

对于两个数 \(a,b\),设 \(a>b\),当 \(a\%b==0\) 时,答案为 \(b\)

否则,设 \(a=b*q+r,r<b\),则 \(gcd(a,b)=gcd(b,a\%b)\) ,时间复杂度 \(O(\log N)\)

递归写法

int gcd(int x,int y){
    return y?gcd(y,x%y):x;
}

循环写法,需要特判0

inline int gcd(int x,int y){
    if(!y)return y;
    while(y^=x^=y^=x%=y);/*新的x为旧的y,新的y为旧的x%y*/
    return x;
}

最小公倍数

对于两个数 \(a,b\),进行质因数分解后可以得到,\(gcd(a,b)*lcm(a,b)=a*b\).

假设某个质因数的指数分别为 \(k_1,k_2\)\(gcd\) 的该质因数的指数为 \(min(k_1,k_2)\)\(lcm\) 的该质因数的指数为 \(max(k_1,k_2)\)\(min(k_1,k_2)+max(k_1,k_2)=k_1+k_2\).

inline int lcm(int x,int y){
    return x*y/gcd(x,y);
}

对于求多个数的最小公倍数或最大公约数,可以求到相邻两个数的答案后再放回去,不会对答案有影响。

扩展欧几里得算法

用于求解 \(ax_1+by_1=gcd(a,b)\) 的一组可行解。

int exgcd(int a,int b,int&x,int &y){
    if(!b)return x=1,y=0,a;
    int g=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return g;
}

原文地址:http://www.cnblogs.com/safeng/p/16906590.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性