信奥赛CSP-S模板大全
总结常用的算法模板
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
搜索
二分
while(l<r)
{
int mid=(l+r+1)>>1;
if(check(mid))
l=mid;
else
r=mid-1;
}
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
数学
快速幂
int qpow(int a,int b)
{
int ret=1;
while(b)
{
if(b&1)
ret=(ret*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ret;
}
LCM(最小公倍数)
int lcm(int x,int y)
{
return (x*y)/gcd(x,y);
}
GCD(欧几里得)
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}
扩展GCD
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int k=x;
x=y;
y=k-a/b*y;
return d;
}
质数判断
bool prime(int x)
{
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
return 0;
return 1;
}
线性筛质数
void euler(int x)
{
cnt=0;
for(int i=2;i<=x;i++)
{
if(!v[i])
prime[++cnt]=i;
for(int j=1;j<=cnt && i*prime[j]<=x;j++)
{
v[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
质因数分解
void divide(int x)
{
cnt=0;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
prime[++cnt]=i,c[cnt]=0;
while(x%i==0)
c[cnt]++,x/=i;
}
if(x>1)
prime[++cnt]=x,c[cnt]=1;
}
求一个数的约数
void factor(int x)
{
cnt=0;
for(int i=1;i<=sqrt(x);i++)
if(x%i==0)
{
fac[++cnt]=i;
if(i!=x/i)
fac[++cnt]=x/i;
}
}
线性筛约数
vector<int> f;
void factors(int x)
{
for(int i=1;i<=x;i++)
for(int j=1;j<=x/i;j++)
f[i*j].push_back(i);
}
求一个数的欧拉函数
int Phi(int x)
{
int ret=x;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
{
ret=ret/i*(i-1);
while(x%i==0)
x/i;
}
if(x>1)
ret=ret*x*(x-1);
return ret;
}
线性筛欧拉函数
void euler(int x)
{
cnt=0;
for(int i=2;i<=x;i++)
{
if(!v[i])
prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt && i*prime[j]<=x;j++)
{
v[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
}
杨辉三角&组合数
void calc(int n)
{
c[0][0]=1;
c[1][0]=c[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
c[i][j]=c[i-1][j]+c[i-1][j-1];
}