数论--基本工具(gcd 快速幂 快速乘)

参考引用链接:
gcd
快速乘/快速幂(+取模)
一:gcd:
(1)求最大公约数也可利用它来求最小公倍数

递归算法:
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); }
循环算法:
ll gcd(ll a,ll b) {while(b^=a^=b^=a%=b);return a;}
库函数:
__gcd(a,b)

(2)扩展gcd:
求x,y使得gcd(a, b) = a * x + b * y;

int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }

    int d = exgcd(b, a % b, x, y);
    int t = x;
    x = y;
    y = t - a / b * y;

    return d;
}

二:快速幂/快速乘
通过位运算以及将乘法转化为加法 加快乘法的进行以及防止爆数据
mul_mod:a*b mod c快速乘
pow_mode: a^b mod c快速幂

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL mul_mod(LL a,LL b,LL c)   
{
    LL ans=0;
    while(b)
    {
        if(b%2)
            ans=(ans+a)%c;
        a=(a+a)%c;
        b/=2;
    }
    return ans;
}
LL pow_mod(LL a,LL b,LL c)  
{
    LL res=1;
    a=a%c;
    while(b)
    {
        if(b%2)
            res=(res*a)%c;  //res=mul_mod(res,a,c);更快
        a=(a*a)%c;   //a=mul_mod(a,a,c);更快
        b/=2;
    }
    return res;
}

int main()
{
    LL a,b,c;
    scanf("%lld%lld%lld",&a,&b,&c);
    printf("%lld\n",mul_mod(a,b,c));
    printf("%lld\n",pow_mod(a,b,c));
    return 0;
}
全部评论

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务