//算法:筛法求素数
//时间复杂度:O(nlognlogn)
//空间复杂度:O(n)
//输出:集合S={x|1<x<=n&&x is a prime}
int n;
bool S[n+1];
void get_prime(){
for(int i=2;i<=sqrt(n);i++) if(!S[i]){
for(int j=i<<1;j<=n;j++)
S[j]=1;
}
}
//算法:筛法求素数
//时间复杂度:O(n)
//空间复杂度:O(n)
//输出:array prime
int n;
bool S[n+1];
int prime[n],tot
void get_prime(){
for(int i=2;i<=n;i++){
if(!S[i]) prime[tot++]=i;
for(int j=0;j<tot&&i*prime[j]<=n;j++){
S[i]=1;
if(i%prime[j]==0) break;
}
}
}
//算法:Euclid算法
//时间复杂度:O(log(a+b))
//空间复杂度:- -
//输出:a integer as the gcd(a,b)
int gcd(int a,int b){
return b? gcd(b,a%b):a;
}
//算法:Pollard's p算法
//时间复杂度:O(n^0.25)
//空间复杂度:- -
//输出:n的一个约数
int pollard(int n){
int x=rand()%n//1~n-1的一个随机数
int res,y=x,k=2,i=1;
while(1){
i++;
x=(x*x-1)%n;
res=gcd(y-x,n);
if(res!=1&&res!=n) return res;
if(i==k) y=x,k<<=1;
}
}
//算法:ex eculid 算法
//时间复杂度:O(log(a+b))
//空间复杂度:- -
//输出:gcd(a+b) and 满足ax+by=gcd(a+b)的一个线性组合(x,y)
int ex_eculid(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}else{
int q=b/a;
int res=ex_eculid(b,a%b,x,y);
x=-x*q+y,y=x;
return res;
}
}
//对于一组解x0,y0;
//x1=x0-b/gcd(a,b)*t,y1=y0+a/gcd(a,b)*t