扩展欧几里得算法

 1 int exgcd(int a,int b,int &x,int &y)
 2 {
 3       int d=a;
 4       if(b==0)
 5       {
 6             x=1;y=0;
 7       }
 8       else
 9       {
10             d=exgcd(b,a%b,y,x);
11             y-=(a/b)*x;
12       }
13       return d;
14 }

 

 

 1 //   整数分解
 2 
 3 map<int ,int > prime_factor( int n)
 4 {
 5       map<int,int > res;
 6       for(int i=2;i*i<=n;i++)
 7             while(n%i==0)
 8       {
 9             res[i]++;
10             n/=i;
11       }
12       if(n!=1)
13             res[n]++;
14       return res;
15 }

 

 

 1 void init()
 2 {
 3       for(int i=0;i<=n;i++)
 4             vis[i]=1;
 5       vis[0]=vis[1]=0;
 6       int m=(int)sqrt(n+0.5);
 7       for(int i=2;i<=m;i++)
 8             if(vis[i])
 9             for(int j=i*i;j<=n;j+=i)
10                   vis[j]=0;
11 }

 

 

 

求[a,b)内的素数。   a<b<10^12;    b-a<=10^6;

 1 bool is_prime[MS];
 2 bool prime[MS2];
 3 
 4 void segment(LL a,LL b)
 5 {
 6       LL i,j;
 7       for( i=0;i*i<b;i++)     //  int i    (LL)i*i<b   特别注意这里
 8             prime[i]=true;
 9       for( i=0;i<b-a;i++)
10             is_prime[i]=true;
11       for(i=2;i*i<b;i++)
12             if(prime[i])
13       {
14             for(LL j=i*i;j*j<b;j+=i)
15                   prime[j]=false;
16             LL x=a/i;
17             if(x*i<a)
18                   x++;
19             for(;x*i<b;x++)
20                   is_prime[x*i-a]=false;
21       }
22 }

 

posted @ 2015-03-27 21:48  daydaycode  阅读(122)  评论(0)    收藏  举报