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