基础数学

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值