数论--基本工具(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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
03-23 15:00
已编辑
厦门大学 Java
xiaowl:你这个简历的问题是对于技术点、项目的描述,都是描述action的,对于面试官而言,仅能知道你干了什么,无法判断你为什么这么干,干的好不好。
点赞 评论 收藏
分享
找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务