【数论】洛谷P3811 乘法逆元

链接

https://www.luogu.org/problemnew/show/P3811

大意

1 n 所有数在 % p 意义下的乘法逆元

思路

乘法逆元是啥?
。。。


听说过倒数吗? a 的倒数就是 1 a 吧?它们的乘积是1,而乘法逆元也有点像倒数。。。

我们假设 a 的乘法逆元为 b ,那么 ( a × b ) m o d   p = 1
对的,就是比倒数多模了一个 p ,而且这里的 a , b 皆为自然数

那么问题来了,到底怎么去求它呢?本蒟蒻由于太弱了,暂时只听说过四种勉强会两种。。。

先安利一波大佬博客:https://www.luogu.org/blog/zyxxs/post-xiao-yi-jiang-tan-qian-tan-sheng-fa-ni-yuan
然后?就没有然后了。。。

求单个数的乘法逆元的代码(p为质数)

#include<cstdio>
using namespace std;long long n,p;
inline void write(register long long x){if(x>9)write(x/10);putchar(x%10+48);return;}
inline long long ksc(long long a,long long b,long long p)//快速乘
{
    a%=p;b%=p;
    long double c=a*b/p;
    long long ans=a*b-c*p;
    if(ans<0) ans+=p;
    if(ans>=p) ans-=p;
    return ans;
}
inline long long ksm(long long x,long long y,long long p)//快速幂
{
    long long ans=1;
    for(;y;y>>=1,x=ksc(x,x,p)) if(y&1) ans=ksc(ans,x,p);
    return ans;
}
signed main()
{
    scanf("%lld%lld",&n,&p);
    write(ksm(n,p-2,p));//输出
}

AC代码

#include<cstdio>
using namespace std;int n,p,inv[3000001];
inline void write(register int x){if(x>9)write(x/10);putchar(x%10+48);return;}
signed main()
{
    scanf("%d%d",&n,&p);
    inv[1]=1;putchar(49);putchar(10);
    for(register int i=2;i<=n;i++) 
    {
        inv[i]=(long long)(p-p/i)*inv[p%i]%p;//垃圾数学公式
        write(inv[i]);putchar(10);
    }
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81779599
今日推荐