1、快速幂
int ksm(int a,int b,int c)
{
int res=1;
while(b)
{
if( b & 1 ) res=(long long) res * a % c;
a=a*a%c;
b>>1;
}
return res%c;
}
2、龟速乘
typedef long long ll;
ll gas(ll a,ll b,ll c)
{
ll res=0;
while(b)
{
if( b & 1 ) res=( res + a ) % c;
a = a * 2 % c;
b>>1;
}
return res % c;
}
2、欧几里得
int gcd(int a,int b)
{if(b==0)return a;return gcd(b,a%b);}//最大公约数
int lcm(int a,int b)
{if(a*b==0)return 0;return a*b/gcd(a,b);}//最小公倍数
4、质数
1、质数判断
bool is_prime(int n)//O(squr(n))
{
if(n<2)return false;
for(int i=2;i<=n/i;i++)if(n%i==0)return false;
return true;
}
2、分解质因数
void divide(int n)//O(squr(n))
{
for(int i=2;i<=n/i;i++)
if(n%i==0)
{
int s=0;
while (n%i==0) {n/=i;s++;}
printf("%d %d\n",i,s);
}
if(n>1)printf("%d %d\n",n,1);
}
3、质数筛--埃式筛
int primes[N],cnt;//cnt,质数的个数
bool st[N];
void get_primes(int n)//埃氏筛O(n*loglog(n))
{
for(int i=2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++]=n;
for(int j=i+i;j<=n;j+=i)st[j]=true;
}
}
}
4、质数筛--线性筛
int primes[N],cnt;//cnt,质数的个数
bool st[N];
void get_prime(int n)//线性筛O()
{
for(int i=2;i<=n;i++)
{
if(!st[i])primes[cnt++]=i;
for(int j=0;primes[j]<=n/i;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0)break;
//primes[j]一定是i的最小值因子
}
}
}