快速幂取模 求(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]);
	}
}