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)