• 高程复习 欧几里得算法和扩展欧几里得算法考试前冲刺简约版


    gcd(m,n)=gcd(n,m%n)

     gcd欧几里得算法标准代码求最大公约数

    1. #include
    2. using namespace std;
    3. typedef long long LL;
    4. LL gcd(int a,int b)
    5. {
    6. if(b==0)return a;
    7. return gcd(b,a%b);
    8. }
    9. int main()
    10. {
    11. LL a,b;
    12. cin>>a>>b;
    13. cout<<gcd(a,b)<
    14. return 0;
    15. }

    LMC  最小公倍数

     这样可以防止a*b溢出

    1. #include
    2. #include
    3. using namespace std;
    4. typedef long long LL;
    5. LL gcd(LL a, LL b)
    6. {
    7. if(b==0)return a;
    8. return gcd(b,a%b);
    9. }
    10. int main()
    11. {
    12. LL a,b,lmc;
    13. while(cin>>a>>b)
    14. {
    15. cout<<gcd(a,b)<
    16. lmc=a/gcd(a,b)*b;
    17. cout<
    18. }
    19. return 0;
    20. }
    1. #include
    2. #include
    3. using namespace std;
    4. typedef long long LL;
    5. int main()
    6. {
    7. LL a,b,lmc,t;
    8. while(cin>>a>>b)
    9. {
    10. t=__gcd(a,b);
    11. cout<
    12. lmc=a/t*b;
    13. cout<
    14. }
    15. return 0;
    16. }

    上面这个使用了c++给我们提供的函数,要求x,y类型一致

    在有些题目中我们要求求出很多个数的最大公约数和最小公倍数。 对于这种问题,基本思想就是两两合并。例如求n个数的最大公约数,就可以这样:

    扩展欧几里得算法到底在干什么?

     扩展欧几里得算法用来解决这样一个问题:给定两个非零的整数a和b,求一组整数解(x,y),使得ax+by=gcd(a,b)成立,其中gcd(a,b)表示a和b的最大公约数。

      利用欧几里得算法的过程来计算x和y。已知递归边界成立时x=1,y=0 ,想办法反推出最开始的x和y。

    x1=y2                     //x=y(old)

    y1=x2-(a/b)y2        //y=x(old)-a/b*y(old);

    扩展欧几里得算法背下来

    1. void Ex_gcd(int a,int b,int &x,int &y)
    2. {
    3. if(b==0)
    4. {
    5. x=1;
    6. y=0;
    7. return;
    8. }
    9. Ex_gcd(int b,int a%b,int x,int y)
    10. {
    11. int t;
    12. t=x;
    13. x=y;
    14. y=t-(a/b)*y;
    15. }
    16. }

    一、逆元的定义    

    当 ax≡1(mod b), x即为 a 在mod b 意义下的逆元。

        逆元的数学符号是 inv ,a 在mod b 意义下的逆元记作 inv(a,b)。注意不要写反了。        

    例如5x≡1(mod 3),当x=2时满足10 ≡ 1(mod3),所以称2是5在mod 3意义下的逆元。

      (a * b) % p = (a%p * b%p) %p (对)

     (a / b) % p = (a%p / b%p) %p (错)

      在求余的过程中我们发现只有除法是不能分开运算的,而当a过大时,在计算除法过程中可能会造成比较大的精度损失,所以对于这种情况我们一般会把式子转换成那么(a / b) % p = (a * inv(b) ) % p = (a % p * inv(b) % p) % p来进行计算。这样就解决了除法不能分开计算的问题。需要注意:只有a和p互质,a才有关于p的逆元

    1. #include
    2. using namespace std;
    3. void Ex_gcd(int a,int b,int &x,int &y)
    4. {
    5. if(b==0)
    6. {
    7. x=1;
    8. y=0;
    9. return;
    10. }
    11. Ex_gcd(b,a%b,x,y);
    12. {
    13. int t;
    14. t=x;
    15. x=y;
    16. y=t-(a/b)*y;
    17. }
    18. }
    19. int main()
    20. {
    21. int a=5,b=7,x,y;
    22. Ex_gcd(a,b,x,y);
    23. cout<
    24. return 0;
    25. }

     

     

    1. #include
    2. using namespace std;
    3. void Ex_gcd(int a,int b,int &x,int &y)
    4. {
    5. if(b==0)
    6. {
    7. x=1;
    8. y=0;
    9. return;
    10. }
    11. Ex_gcd(b,a%b,x,y);
    12. int t;
    13. t=x;
    14. x=y;
    15. y=t-(a/b)*y;
    16. }
    17. int main()
    18. {
    19. int a,b,x,y;
    20. cin>>a>>b;
    21. Ex_gcd(a,b,x,y);
    22. if(x<0)
    23. x=(x+b)%b;
    24. cout<
    25. return 0;
    26. }

     注意这道题没说求逆元,求的是正的最小正整数解

    因为求的逆元有可能是负的,一应要考虑求出来的x是负数的情况!

     

    1. #include
    2. using namespace std;
    3. typedef long long LL;
    4. void ex_gcd(LL a,LL b,LL &x,LL &y)
    5. {
    6. if(b==0)
    7. {
    8. x=1;
    9. y=0;
    10. return ;
    11. }
    12. ex_gcd(b,a%b,x,y);
    13. int t=x;
    14. x=y;
    15. y=t-(a/b)*y;
    16. }
    17. int main()
    18. {
    19. LL n,ans,x,y;
    20. ex_gcd(6,1007,x,y);
    21. x=(x+1007)%1007;
    22. while(cin>>n)
    23. {
    24. ans=(n*(n+1))%1007;
    25. ans=(ans*(2*n+1))%1007;
    26. ans=(x*ans)%1007;
    27. cout<
    28. }
    29. return 0;
    30. }

    实在不会就背,感觉有点难理解为什么要用逆元

     考试的时候按输入案例给分,遇到这种案例你不会就是不会了,所以一定要自己多练习

  • 相关阅读:
    一篇文章带你了解Python常用自动化测试框架 —— Pytest
    spring tx:advice事务配置—— tx:advice中不允许出现属性 ‘transaction-manager‘
    flink cdc 没有Replication client ,Replication slave权限,报错,处理
    基于android的移动学习平台(前端APP+后端Java和MySQL)
    【Pytorch】深度学习之数据读取
    基于SSM框架的家教中介平台系统的设计与实现(源码免费获取)
    复盘在项目管理中的应用
    避坑:使用torchvision.transforms.functional.adjust_gamma进行gamma变换时需注意输入数据的类型
    关于华为产品生命周期
    非对称渐开线齿轮学习笔记分享
  • 原文地址:https://blog.csdn.net/zn2021220822/article/details/130855933