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

乘法逆元模板

时间:2019-11-15 22:34:46      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:amp   register   oid   long   gis   namespace   while   its   getch   

单个数O(logmod)求逆元

$View$ $Code$

const int mod=998244353;
inline long long qpow(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b&1)
            ans=ans*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return ans%mod;
}
long long calcinv(long long x)
{
    return qpow(x,mod-2);
}

O(n)求1~n的逆元(线性逆元)

\(View\) \(Code\)

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int ret=0,f=1;
    char ch=getchar();
    while('9'<ch||ch<'0')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while('0'<=ch&&ch<='9')
    {
        ret=(ret<<1)+(ret<<3)+ch-'0';
        ch=getchar();
    }
    return ret*f;
}
int n,p;
long long inv[3000005];
int main()
{
    n=read();
    p=read();
    inv[1]=1;
    for(register int i=2;i<=n;i++)
        inv[i]=1ll*(p-p/i)*inv[p%i]%p;
    for(register int i=1;i<=n;i++)
        printf("%lld\n",inv[i]);
    return 0;
}

O(n)求1~n的阶乘的逆元(阶乘逆元)

$View$ $Code$

const int mod=998244353;
int maxn;
long long ans,fac[100005],inv[100005];
inline void pre()
{
    fac[1]=1;
    inv[0]=1;
    for(register int i=2;i<=maxn;i++)
    {
        fac[i]=fac[i-1]*i%mod;
    }
    inv[maxn]=qpow(fac[maxn],mod-2,mod);
    for(register int i=maxn;i;i--)
    {
        inv[i-1]=inv[i]*i%mod;
    }
}

乘法逆元模板

标签:amp   register   oid   long   gis   namespace   while   its   getch   

原文地址:https://www.cnblogs.com/Peter0701/p/11869760.html

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