一、筛法求素数
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,prime[30010],cnt; 5 bool is_prime[30010]; 6 void solve(){ 7 for(int i=2;i<=n;i++){ 8 if(is_prime[i]==0)prime[++cnt]=i; 9 for(int j=1;j<=cnt;j++){ 10 if(i*prime[j]>n)break; 11 is_prime[i*prime[j]]=1; 12 if(i%prime[j]==0)break; 13 } 14 } 15 } 16 int main(){ 17 scanf("%d",&n); 18 solve(); 19 for(int i=1;i<=cnt;i++) 20 printf("%d ",prime[i]); 21 }
(更快的Miller-Rabin 素数判定、AKS素数判定不在此整理)
二、最大公约数
1 int GCD(int x,int y){ 2 if(y==0) return x; 3 else return GCD(y,x%y); 4 } 5 int XXGCD(int x,int y){ 6 if(x<y) swap(x,y); 7 int temp; 8 while(y!=0){ 9 temp=x%y;x=y;y=temp; 10 } 11 return x; 12 }// 据清华某犇说 辗转相除法比上边那个跑得快
顺便搞一下扩展欧几里得:
1 int exgcd(int a,int b,int &x,int &y){ 2 if(b==0){ 3 x=1; y=0; 4 return a; 5 } 6 int ans=exgcd(b,a%b,y,x); 7 y-=a/b*x; 8 return ans; 9 }
POJ2142:
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int exgcd(int a,int b,int &x,int &y){ 5 if(b==0){ 6 x=1; y=0; 7 return a; 8 } 9 int ans=exgcd(b,a%b,y,x); 10 y-=a/b*x; 11 return ans; 12 } 13 int main() { 14 int a=1,b,c,x,y; 15 bool Gavin; 16 while (a || b || c){ 17 scanf("%d%d%d",&a,&b,&c); 18 if (!a&&!b&&!c) break; //之前没有加这一句,输入最后的000结束时会继续运行一次,致命错误,被0除。 19 Gavin=0; 20 if(a<b){ 21 swap(a,b);Gavin=1; 22 } 23 int gcd=exgcd(a,b,x,y); 24 a/=gcd;b/=gcd;c/=gcd; 25 x*=c;y*=c; 26 int t=y/a,x1,y1,x2,y2,ansx,ansy; 27 while(y-a*t<0) t--; 28 x1=abs(x+b*t);y1=abs(y-a*t); 29 t++; 30 x2=abs(x+b*t);y2=abs(y-a*t); 31 if ((x1+y1<x2+y2)||(x1+y1==x2+y2)&&(x1*a+y1*b<x2*a+y2*b)) 32 ansx=x1,ansy=y1; 33 else ansx=x2,ansy=y2; 34 if(Gavin) printf("%d %d ",ansy,ansx); 35 else printf("%d %d ",ansx,ansy); 36 } 37 return 0; 38 }
三、快速幂取模
void power(int a,int b,int mo){ long long ans=1; for(int i=1;i<=b;i++){ ans*=a; ans%=mo; } } long long FastPower(int a,int b,int mo){ long long ans=1; a%=mo; while(b){ if(b & 1) ans=(ans*a)%mo;// b 此时是奇数 b >> =1;// 相当于是 b /= 2 ; a=(a * a) % mo; } return ans; }
四、质因数分解
1 #include<cstdio> 2 int n,a[10010],cnt; 3 int main() 4 { 5 scanf("%d",&n); 6 for(int i=2;i<=n;i++){ 7 while(n%i==0 && n>0){ 8 a[++cnt]=i; 9 n/=i; 10 } 11 } 12 for(int i=1;i<=cnt;i++) 13 printf("%d ",a[i]); 14 return 0; 15 }