关于一些数学模板
线性筛
for(int i=2;i<=n;++i){
if(!f[i])pri[++tot]=i;
for(int j=1;j<=tot&&pri[j]*i<=n;++j){
f[pri[j]*i]=1;
if(i%pri[j]==0)break;
}
}
n!分解质因数
void fj(int x){
for(int i=1;i<=tot;i++){
int tp=x;
while(tp)sum[i]+=tp/pri[i],tp/=pri[i];
}
}
(varphi(x)=x(1-1/p_1)(1-1/p_2).....(1-1/ p_n))
关于exgcd
求ax+by=c的一个特殊解
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
if(b==0){d=a;x=1;y=0;return;}
exgcd(b,a%b,d,x,y);
ll tmp=x;
x=y;y=tmp-a/b*y;
}
推导过程:
//ax+by=gcd(a,b)
//bx1+(a%b)y1=gcd(b,a%b)
//ax+by=bx1+(a%b)y1
//ax+by=bx1+(a-b*a/b)y1
//ax+by=bx1-b*a/b*y1+ay1
//ax+by=b(x1-a/b*y1)+ay1
//x=y1 y=x1-a/b*y1