1.判定质数:
- 质数(严格大于1)是有且只有1和它本身两个因子。
2.分解质因数:
- 任何一个数都可以写成n个质数的几次方相乘的形式
- 一个数最多存在一个大于等于sqrt(n)的因数
3.筛质数
- 朴素筛质数 nlog(n)
- 埃氏筛法 nloglog(n)
- 线性筛法 保证合数只被最小质因子筛掉
//判断质数
bool is_prime(int n)
{
if(n<2) return false;
for(int i=2;i<n/i;i++)
if(n%i==0) return false;
return true;
}
//分解质因数
void divide(int n)
{
for(int i=2;i<n/i;i++)
{
if(n%i==0)//i一定是质数,枚举到i时,n当中已经没有2到i-1的因子了(都除尽了),n时i的倍数,则i也没有2到i-1的因子
{
int s=0;
while(n%i==0)
{
n/=i;
s++;
}
printf("%d %d",i,s);
}
}
if(n>1) printf("%d %d",n,1); puts(" ");
}
bool st[N];
int primes[N],cnt;
//朴素筛法
void get_prime(int n)
{
for(int i=2;i<n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(j=i*i;j<n;j+=i;)
st[j]=true;
}
}
//埃氏筛法
void gei_primes(int n)
{
for(int i=2;i<n;i++)
{
if(!st[i])
{
primes[cnt++]=i;
//只算质数的倍数,因为非质数(前面有约数)已经把它筛掉了
for(int j=i*i;j<n;j+=i)
st[j]=true;
}
}
}
//线性筛法
void get_primes()
{
for(int i=2;i<n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]<=n/i;j++)
{
st[i*primes[j]]=true;
if(i%primes[j] == 0) break;//保证合数只被最小质因子筛掉
}
}
}
- 试除法求约数
- 约数个数
- 约数之和
- 最大公约数 欧几里得算法/辗转相除法 (a,b)=(b,a%b)
//约数个数
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int mod=1e9+7;
typedef long long LL;
int main()
{
int n;
cin>>n;
unordered_map<int,int> um;
while(n--)
{
int x;
cin>>x;
for(int i=2;i<=x/i;i++)
while(x%i==0)
{
x/=i;
um[i]++;
}
if(x>1) um[x]++;
}
LL res = 1;
for(auto t:um) res=res*(t.second+1)%mod;
cout<<res<<endl;
return 0;
}
//约数之和
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int mod=1e9+7;
typedef long long LL;
int main()
{
int n;
cin>>n;
unordered_map<int,int> um;
while(n--)
{
int x;
cin>>x;
//分解质因数
for(int i=2;i<=x/i;i++)
{
while(x%i==0)
{
x/=i;
um[i]++;
}
}
if(x>1) um[x]++;
}
LL res=1;
for(auto t:um)
{
int p = t.first,a=t.second;
LL y=1;
while(a--) y=(y*p+1)%mod;//p的0次幂到p的a次幂的和
res = res*y % mod;
}
cout<<res<<endl;
return 0;
}
//欧几里得 最大公约数
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
return b? gcd(b,a%b):a;
}
int main()
{
int x;
cin>>x;
while(x--)
{
int a,b;
cin>>a>>b;
int res = gcd(a,b);
cout<<res<<endl;
}
return 0;
}