zoukankan      html  css  js  c++  java
  • 数论学习 算法模板(质数,约数)

    今天看了一个前辈的模板挺好的 借鉴一下:https://blog.csdn.net/f_zyj/article/details/51594851
    https://blog.csdn.net/weixin_43093481/article/details/82229718

    1
    .试除法判质数 bool is_prime(int n) { if(n<2)return false; for(int i=2;i<=sqrt(n);i++) if(ni==0)return flase; return true; } 2.埃式筛 void prime(int n) { memset(v,0,sizeof(v); for(int i=2;i<=n;i++) { if(!v[i])prime[++m]=i; for(int j=1;j<=n/i;j++) { v[i*j]=1; } } } 3.线性筛法 const ll N = 1000000; ll v[N],prime[N]; int inint(int n) { int m=0; for(int i=2;i<=n;i++) { if(!v[i]) { v[i]=i; prime[++m]=i; } forint j=1;j<=m;j++) { if(prime[j]>n/I||prime[j]>v[i])break; v[i*prime[j]]=prime[j]; } } } 4.试除法质因数分解 void divid(int n) { m = 0; for(int i=2;i< = sqrt(n);i++) { if(n%i) { p[++m]=i,c[m]=0; while(n%i==0) { n/=i; c[m]++; } } } if(n>1) p[++m]=n, c[m]=1; for(int i=1;i<=m;i++) cout <<p[i]<<" "<<c[i]<<endl; } 5.求1~N每个数的正约数集合—————倍数法 vector<int>factor[500010]; int n; cin >>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n/i;j++) factor[i*j].push_back(i); } for(int i=1;i<=n;i++) { for(intj=0;j<factor[i].size();j++) printf("%d ",factor[i][j]); puts(" "); }

    6.更相减损术

    适合于较大的数求最大公约数

    若a>b:

    gcd(a,b) = gcd(b,a-b) = gcd(a,a-b)

    gcd(2a,2b) = 2gcd(a,b)

    7.欧几里得算法

    int gcd(int a,int b)
    {
    if (a < b)
    swap(a, b);
    return b == 0 ? a : gcd(b, a % b);
    }

    
    

    9.欧拉函数
    单个欧拉函数代码:
    long long Euler( long long n ){

    
    

    long long res = n;
    for( long long i =2 ;i*i<=n;i++){

    
    

    if( n %i == 0 ){
    n/=i;
    res = res - res/i;
    }

    
    

    while( n % i==0)
    n/=i;

    
    

    }
    if( n > 1 )
    res = res - res/n;
    return res;
    }
    欧拉函数筛法:

    
    

    for(int i=2;i<=N;i++)
    euler[i]=i;
    for(int i=2;i<=N;i++)
    if(euler[i]==i)
    for(int j=i;j<=n;j+=i)
    euler[j]=euler[j]/i*(i-1);

    
    


    10.扩展欧几里得

    
    

    void gcd(int a,int b,int &d,int &x,int &y)
    {
    if(!b)
    {
    d=a;
    x=1;
    y=0;
    }
    else
    {
    gcd(b,a%b,d,y,x);
    y -=x*(a/b);
    }
    }

    
    

    11.裴蜀定理(或贝祖定理,Bézout's identity)
    若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
    它的一个重要推论是:a,b互质的充要条件是存在整数x,y使ax+by=1.

    
    

    12.

    乘法逆元

    看到一篇博客写的特别好,这里推荐一下

    https://blog.csdn.net/zhjchengfeng5/article/details/7786595
    什么叫乘法逆元?

    
    

    a*x = 1(mod m)

    
    

    这里,我们称 x 是 a 关于 m 的乘法逆元
    这怎么求?可以等价于这样的表达式: a*x + m*y = 1

    
    

    看出什么来了吗?没错,当gcd(a , m) != 1 的时候是没有解的这也是 a*x + b*y = c 有解的充要条件: c % gcd(a , b) == 0

    
    
    
    
    
    
    
    
    
    
    


    你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。
  • 相关阅读:
    Delphi系统变量:IsMultiThread对MM的影响
    Delphi7中 string, AnsiString, Utf8String,WideString的区别分析
    Delphi之TComponent类
    delphi -----(去掉窗口最大化,最小化、关闭),主窗口,和子窗口之间的设置
    Application.Title与Application.MainFormOnTaskbar之间的关系
    DELPHI用户登录窗口框架
    Element 1.2.7 发布,饿了么 Vue 2.0 组件库
    用Delphi实现网络视频编程
    甘超波:NLP是什么?
    OpenCV使用filter2D实现图像对比度提升
  • 原文地址:https://www.cnblogs.com/wangzhe52xia/p/11378991.html
Copyright © 2011-2022 走看看