埃氏筛法 大素数 中国剩余定理

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;  
}  








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值