快速幂取模 求(a^b)%c
int q_mod(int a,int b,int c){
int ans=1;
a=a%c; //先求余,缩短运算规模。(有时候不用)
while(b){
if(b&1)
ans=(ans*a)%c;
b>>=1;
a=(a*a)%c;
}
return ans;
}
GCD(最大公约数)1.c语言基础型 int gcd(int a,int b){int n;while(b){n=a%b;a=b;b=n;}return a;} 2.递归实现int gcd(int a,int b){return (b>0)?gcd(b,a%b):a;}
或者
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}3.位运算实现int gcd(int a,int b){while(b^=a^=b^=a%=b);return a;}
LCM(最小公倍数)
ll lcm(ll a,ll b)
{
return a/gcd(a,b)*b;
}
素筛
a[0]=a[1]=1; 真值非素数
for(i=2;i*i<max;i++){
if(!a[i])
for(j=i+i;j<max;j+=i){
a[j]=1;
}
}
素数判定
int prime(int a){
if(a==0||a==1)
return 0;
if(a==2)
return 1;
int n=sqrt(a);
for(int i=2;i<=n;i++){
if(a%i==0)
return 0;
return 1;
}
}
完全错排
typedef unsigned long long ull;
ull f[30];
void list(){
f[1]=0;f[2]=1;
for(ull i=3;i<=30;i++){
f[i]=(i-1)*(f[i-1]+f[i-2]);
}
}