您的位置:首页 > 其它

基础数学

2017-05-22 17:02 113 查看
gcd–最大公约数与lcm–最小公倍数

void gcd(int a,int b) {

return b==0?a:gcd(b,a%b);

}


这个式子基于这样一个事实: gcd(a,b)=gcd(b,b%a);

证明:

设:a,b(a>b),d为a,b的一个公约数,a=sd,b=td,b=aq+r;

所以: a%b=r ;a\b=q; 若r等于0,则b为a的一个约数,所以b为最大公约数

若r!=0 可以证明 b与r的最大公约数与a与b的最大公约数相等

r=(s-tq)d;如果不懂可以看这里

lcm*gcd=a*b;

筛法

素数筛:

void Euler_Prime() {
for(int i=2;i<=n;i++) {
if(!vis[i]) pri[++tot]=i;
for(int j=1;j<=tot;j++) {
int prime=pri[j];
if(i*prime>n) break;
vis[i*prime]=1;
if(i%prime==0) break;
}
}
}`


Eratosthenes筛:

int Eratosthenes_Prime(){
for(int i=2;i<=n;i++) {
if(!vis[i]) {
pri[++tot]=i;
for(int j=1;(i*j)<=n;j++) vis[i*j]=1;
}
}
}


莫比乌斯函数,容斥,欧拉函数,积性函数之后再写orz……

扩展欧几里得定理:

void gcd(int a,int b,int& d,int& x,int& y) {
if(!b) {d=a;x=1;y=0};
else {gcd(b,a%b,d,x,y);y-=x*(a/b);}
}


证明

结论:(x0+kb1,y0-ka1)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法