数论复习

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;
}
posted @ 2020-10-27 13:20  一杯好凉茶  阅读(106)  评论(0编辑  收藏  举报