埃氏筛打表求素数
void isprime(int n){
cnt=0;
memset(vis,0,sizeof vis);
for(int i=2;i<n;i++){
if(!vis[i]){
prime[cnt++]=i;
for(int j=i*i;j<n;j+=i)
vis[j]=1;
}
}
}
唯一分解定理求不超过n的因子个数
LL cal(LL n){
LL ans=1;
for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++){
if(n%prime[i]==0){
LL cnt1=0;
while(n%prime[i]==0){
cnt1++;n/=prime[i];}
ans*=(1+cnt1);
if(n==0)break;
}
}
if(n>1)ans*=2;
return ans;
}
打表法求欧拉phi函数
void phitable(int n){
for(int i=2;i<=n;i++)phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++)if(!phi[i])
for(int j=i;j<=n;j+=i){
if(!phi[j])phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
快速幂,快速乘,第50道题给了它(纪念一下)
LL ppow(LL a,LL b,LL mod){
LL ans=1;
while(b>0){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
LL qpow(LL a,LL b,LL mod){
LL ans=0;
while(b>0){
if(b&1)ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
欧拉定理求调和级数
const double C=0.57721566490153286060651209;
log(n*1.0)+C+1.0/(2.0*n) //n>1e4
扩展欧几里得算法
void exgcd(LL a,LL b,LL &d,LL &x, LL &y){
if(!b){
d=a;x=1;y=0;
return;
}
else exgcd(b,a%b,d,x,y);
LL t=x;
x=y;
y=t-(a/b)*y;
}
欧拉 定理