扩展欧几里得算法
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 }

浙公网安备 33010602011771号