码迷,mamicode.com
首页 > 其他好文 > 详细

数论知识整理

时间:2019-01-03 23:08:56      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:work   算法   公倍数   复杂度   turn   mod   扩展欧几里得   扩展   公约数   

代码均未经过编译!!!(不用编译啦)

默认:

#define ll long long

快速幂

正整数a,b,p,求a^b(mod p)的值,时间复杂度O(logb)

ll ksm(ll a, ll b, ll p) {
    ll c = 1 % p;
    a %= p;
    while (b) {
        if (b & 1) c = c * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return c;
}

最大公约数

正整数a,b,求a,b的最大公约数,时间复杂度在log级别

ll gcd(ll a, ll b) {
    return b ? gcd(b, a % b) : a;
}

最小公倍数

正整数a,b,求a,b的最小公倍数,时间复杂度在log级别

ll lcm(ll a, ll b) {
    return a * b / gcd(a, b);
}

扩展欧几里得算法

正整数a,b,求ax+by=gcd(a,b)一组解,同时返回gcd(a,b),时间复杂度在log级别

ll exgcd(ll a, ll b, ll &x, ll &y) {
    if (!b) {
        x = 1;
        y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, x, y), z = x;
    x = y;
    y = z - a / b * y;
    return d;
}

正整数a,b,c,求a*x≡c(mod b)一组解,无解返回“-1”,时间复杂度在log级别

ll work(ll a, ll b, ll c) {
    ll x, y, d = exgcd(a, b, x, y);
    if (c % d) return -1;
    return c / d * x;
}

数论知识整理

标签:work   算法   公倍数   复杂度   turn   mod   扩展欧几里得   扩展   公约数   

原文地址:https://www.cnblogs.com/xht37/p/10217406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!