数论--求逆元

模板:

#include<bits/stdc++.h>
using namespace std;
//求a在mod m的情况下的逆元  

// 1.扩展欧几里得法
long long extendGcd(long long a, long long b, long long &x, long long &y)
{
    if (a == 0 && b == 0)
    {
        return -1;  //  无最大公约数
    }
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    long long d = extendGcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}
long long inv1(long long a, long long n)
{
    long long x, y;
    long long d = extendGcd(a, n, x, y);
    if (d == 1)
    {
        return (x % n + n) % n;
    }
    else
    {
        return -1;  //  无逆元
    }
}


/*   2.递归写法 
 *  只能求a < m的情况,且a与m互质
 *  求ax = 1(mod m)的x值,即逆元(0 < a < m)
 */
long long inv2(long long a, long long m)
{
    if (a == 1)
    {
        return 1;
    }
    return inv2(m%a, m) * (m - m / a) % m;
}

/*
    3.欧拉函数法 
    a和m互质 m为素数 
    快速幂取模 
*/
long long powM(long long a, long long b, long long m)
{
    long long t=1,tt=a%m;
    while(b)
    {
        if(b&1)t=t*tt%m;
        tt=tt*tt%m;
        b>>=1;
    }
    return t;
}

long long inv3(long long a, long long m)
{
    return powM(a, m - 2, m);
}


//4.补充 求阶乘的逆元
typedef long long ll;
const ll MOD =  1e9+7;    //  必须为质数才管用
const ll MAXN = 1e5 + 3;
ll fac[MAXN];       //  阶乘
ll inv[MAXN];       //  阶乘的逆元

ll QPow(ll x, ll n)
{
    ll ret = 1;
    ll tmp = x % MOD;

    while (n)
    {
        if (n & 1)
        {
            ret = (ret * tmp) % MOD;
        }
        tmp = tmp * tmp % MOD;
        n >>= 1;
    }

    return ret;
}

void init()
{
    fac[0] = 1;
    for (int i = 1; i < MAXN; i++)
    {
        fac[i] = fac[i - 1] * i % MOD;
    }
    inv[MAXN - 1] = QPow(fac[MAXN - 1], MOD - 2);
    for (int i = MAXN - 2; i >= 0; i--)
    {
        inv[i] = inv[i + 1] * (i + 1) % MOD;
    }
} 


int main()
{
    long long a,m;
    init(); 
//    cin>>a>>m;
//    cout<<inv1(a,m)<<endl;
//    cout<<inv2(a,m)<<endl;
//    cout<<inv3(a,m)<<endl;
    for(int i=1;i<=5;i++)
    {
        cout<<fac[i]<<" "<<inv[i]<<endl;
    }
    return 0;
 } 

全部评论

相关推荐

昨天 10:23
已编辑
湖南师范大学 计调
太久没更新,前几天看到一条评论,说“牛客就是当年那群做题区毕业了开始找工作还收不住那股味”的群体。字里行间透着居高临下的评判,不是,他该不会以为自己很幽默?很犀利吧?作为在牛客混了不算短日子的用户,我感到的不只是被冒犯,更是一种深刻的悲哀——这种以“松弛感”为名,对另一种生存策略的轻蔑,颇有一种自己考不上大学早早出来混社会,嘲笑考上大学的人是书呆子,然后大言不惭地说:死读书有什么用,人脉和资源才是硬道理。我不知道说这个话的人,手头究竟握着多少真正管用的人脉与资源,也不知道他这么傲慢地说出“那股味”的时候,是站在哪一个巨人的肩膀上,才能如此“松弛从容”地俯视众生,还能品评出别人身上“没收住”的余...
淬月星辉:这种评论把正常的努力扭曲成卷😂,说白了就是自己不努力,看着身边努力的人一个个都事业有成了,自己的心里开始不平衡了,就发这种酸言酸语。牛客可以说是我用过那么多平台里社区氛围最好的论坛了,用了大半年了,基本上没见过有人吵架的,都是在互帮互助提建议,帮忙看简历的,帮忙选offer的,帮忙指点学习路线的,分享工作经验和趣事的,我觉得这才是互联网该有的样子。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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