如何在c ++中找到模乘法逆

时间:2017-04-25 08:35:07

标签: c++ modulus modular-arithmetic

#include <bits/stdc++.h>

#define mx 1000005
#define mod 1000003

using namespace std;

long long arr[mx];

int fact()
{
    arr[0]=1;
    for(int i=1; i<mx; i++)
    {
        arr[i]=((i%mod)*(arr[i-1]%mod))%mod;
    }
}

int main()
{
    int t;
    long long a,b,C,E;
    fact();
    cin>>t;
    while(t--)
    {
        cin>>a>>b;

        C=(arr[a]%mod)%mod;
        E=((arr[b])%mod)*((arr[a-b])%mod)%mod;
    }

}

在这个问题中,我必须计算(C / E)%1000003 。我怎么能用模块乘法逆技术做到这一点?有其他方式来计算吗?

1 个答案:

答案 0 :(得分:4)

因为1000003是素数。

long long mod = 1000003;
inline long long mpow(long long b, long long ex){
    if (b==1)return 1;
    long long r = 1;
    while (ex ){
        if (ex&1)r=(r * b)%mod;
        ex = ex >> 1;
        b = (b * b)%mod;}
    return r;
}

然后做

inverse of E % mod is = mpow(E,mod-2)

Fermats's little theorem

geekforgeeks