质数、约数
质数的判定——试除法
时间复杂度O(sqrt(n))
写sqrt(n)比较慢,i*i<=n容易溢出
bool is_prime(int x) { if(x<2) return false; for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true; }
分解质因数——试除法
n中只包含一个大于sqrt(n)的因子
时间复杂度O(logn~sqrt(n))
void divide(int x) { for(int i=2;i<=x/i;i++) if(x%i==0) { int s=0; while(x%i==0) x/=i,s++; cout<<i<<" "<<s<<endl; } if(x>1) cout<<x<<" "<<1<<endl; }
筛法
O(n^2)
void get_primes(int x) { for(int i=2;i<=x;i++) { int flag=0; for(int j=2;j<i;j++) { if(i%j==0) { flag=1; break; } } if(flag==0) primes[cnt++]=i; } }
O(nlogn)
void get_primes(int x) { for(int i=2;i<=x;i++) { if(!st[i]) { primes[cnt++]=i; } for(int j=i+i;j<=x;j+=i) st[j]=true; } }
O(nloglogn)埃氏筛
void get_primes(int x) { for(int i=2;i<=x;i++) { if(!st[i]) { primes[cnt++]=i; for(int j=i+i;j<=x;j+=i) st[j]=true; } } }
O(n)欧拉筛
void get_primes(int x) { for(int i=2;i<=x;i++) { if(!st[i]) primes[cnt++]=i; for(int j=0;primes[j]<=x/i;j++) { st[primes[j]*i]=true; if(i%primes[j]==0) break; } } }
求约数——试除法
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; vector<int> get_divisors(int x) { vector<int> res; for (int i = 1; i <= x / i; i ++ ) if (x % i == 0) { res.push_back(i); if (i != x / i) res.push_back(x / i); } sort(res.begin(), res.end()); return res; } int main() { int x; cin>>x; vector <int> ans=get_divisors(x); for(vector<int>::iterator i=ans.begin();i!=ans.end();i++) cout<<*i<<" "; }
约数个数
#include<iostream> #include<cstdio> #include<map> using namespace std; int main() { int n; cin>>n; map <int,int> primes; for(int i=2;i<=n/i;i++) while(n%i==0) { n/=i; primes[i]++; } int ans=1; for(map<int,int>::iterator i=primes.begin();i!=primes.end();i++) { ans=ans*(i->second+1); } cout<<ans; return 0; }
约数之和
#include<iostream> #include<cstdio> #include<map> using namespace std; int main() { int n; cin>>n; map <int,int> primes; for(int i=2;i<=n/i;i++) while(n%i==0) { n/=i; primes[i]++; } if(n>1) primes[n]++; int ans=1; for(map<int,int>::iterator i=primes.begin();i!=primes.end();i++) { int p=i->first,a=i->second; int t=1; while(a--) t=t*p+1; ans=ans*t; } cout<<ans; return 0; }

浙公网安备 33010602011771号