一、判断质数 ( sqrt ( N ) )
bool isPrime(int n)
{
if(n<2) return false;
for(int i=2;i<=n/i;i++)
if(n%i==0) return false;
return true;
}
二、分解质因子 ( N )和 ( Log(N) ~ sqrt ( N ) )
void divide (int n)
{
for(int i=2;i<=n;i++)
if(n%i==0)
{
int s=0;
while(n%i==0){
s++;
n/=i;
}
printf("%d %d\n",i,s);
}
}
void divide (int n)
{
for(int i=2;i<=n/i;i++)
if(n%i==0)
{
int s=0;
while(n%i==0){
s++;
n/=i;
}
printf("%d %d\n",i,s);
}
if(n>1) printf("%d 1\n",n);
}
三、朴素筛质数 ( n Log ( n ) )
const int N = 10e4+10;
bool st[N];
int prime[N];
int getPrime(int n)
{
int cnt=0;
for(int i=2;i<=n;i++){
if(!st[i]){
prime[cnt++]=i;
}
for(int j=i+i;j<=n;j+=i) st[j]=true;
}
return cnt; //返回 2~n 中质数个数
}
四、埃氏筛法 (n loglog n)
const int N = 10e4+10;
bool st[N];
int prime[N];
int getPrime(int n)
{
int cnt=0;
for(int i=2;i<=n;i++){
if(!st[i]){
prime[cnt++]=i;
for(int j=i+i;j<=n;j+=i) st[j]=true;
}
}
return cnt;
}
五、线性筛法 ( n )
const int N = 10e8;
bool st[N];
int prime[N];
int getPrime(int n)
{
int cnt=0;
for(int i=2;i<=n;i++)
{
if(!st[i]) prime[cnt++]=i;
for(int j=0;prime[j]<=n/i;j++){
st[prime[j]*i]=true;
if(i%prime[j]==0) break;
}
}
return cnt;
}
六、试除法求约数
vector <int> getDivisors(int n)
{
vector <int> res;
for(int i=1;i<=n/i;i++)
{
if(n%i==0){
res.push_back(i);
if(i!=n/i) res.push_back(n/i);
}
}
sort(res.begin(),res.end());
return res;
}
七、约数个数 && 约数之和
//约数个数
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 10e9+7;
map <int,int> mp;
int main()
{
int n;
long long res=1;
cin>>n;
for(int i=2;i<=n/i;i++)
{
while(n%i==0){
n/=i;
mp[i]++;
}
}
if(n>1) mp[n]++;
for(auto p:mp){
res=res*(p.second+1)%MOD;
}
cout<<res;
return 0;
}
//约数求和
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 10e9+7;
map <int,int> mp;
int main()
{
int n;
long long res=1;
cin>>n;
for(int i=2;i<=n/i;i++)
{
while(n%i==0){
n/=i;
mp[i]++;
}
}
if(n>1) mp[n]++; //分解质因数
for(auto t:mp){
int p=t.first,a=t.second;
long long k=1;
while(a--) k=(k*p+1)%MOD;
res=res*k%MOD;
}
cout<<res;
return 0;
}
八、辗转相除法
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}