const int N=1000005;
int prime[N];
void IsPrime(){ //埃式筛法打质数表
prime[0]=0;prime[1]=0;prime[2]=1;
for(int i=3;i<N;i++)
prime[i]=(i%2==0?0:1);
for(int i=3;i<=sqrt(N);i++) {
if(prime[i]) {
for(int j=i*i;j<=N;j+=2*i)
prime[j]=0;
}
}
}
===大素数===
long long pow_mod(long long a,long long n,long long m){ //快速幂运算
if(n==0) return 1;
long long x=pow_mod(a,n/2,m);
long long ans=x*x%m;
if(n%2==1) ans=ans*a%m;
return ans;
}
bool test(int n,int a,int b){
if(n==2||n==a) return true;
if((n%2)==0) return false;
if(pow_mod(a,b,n)==1) return true;
else return false;
}
bool isPrime(int n){
int a[]={2,3,61};
for(int i=0;i<3;i++){
if(test(n,a[i],n-1))
return true;
}
return false;
}
======中国剩余定理========
void extend_Euclid(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return;
}
extend_Euclid(b, a % b, x, y);
int tmp = x;
x = y;
y = tmp - (a / b) * y;
}
int CRT(int a[],int m[],int n) //x=a[i] mod m[i] n->the amount of number
{
int M = 1;
int ans = 0;
for(int i=1; i<=n; i++)
M *= m[i];
for(int i=1; i<=n; i++)
{
int x, y;
int Mi = M / m[i];
extend_Euclid(Mi, m[i], x, y);
ans = (ans + Mi * x * a[i]) % M;
}
if(ans < 0) ans += M;
return ans;
}