1.欧几里得算法:
gcd(a,b)==gcd(b,a%b)
2.扩展欧几里得:
a∈Z,b∈Z,总存在x∈Z,y∈Z,使得ax+by=gcd(a,b)
3.裴蜀定理:
方程ax+by=c(线性丢番图方程)有整数解的充分必要条件是c是gcd(a,b)的倍数(比扩展欧几里得更具广泛性)
4.枚举质数筛:
挨个枚举到平方根即可
5.埃氏筛:
由古希腊数学家埃拉托斯特尼所提出,把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
代码实现:
int isprime;
void aishishai(int n){
memset(isprime,true,sizeof(isprime));
for(int i=2;i*i<=n;i++){
if(isprime[i])
for(int j=i*i;j<=n;j+=i) isprime[j]=0;
}
}
6.线性筛(欧拉筛)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define MAX 100000
long long su[MAX],cnt;
bool isprime[MAX];
void prime()
{
cnt=1;
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;
for(long long i=2;i<=MAX;i++)
{
if(isprime[i])
su[cnt++]=i;
for(long long j=1;j<cnt&&su[j]*i<MAX;j++)
{
isprime[su[j]*i]=0;
}
}
}
int main()
{
int n;
cin>>n;
prime();
for(long long i=1;su[i]<=n;i++)
printf("%d ",su[i]);
return 0;
}