链接
https://www.luogu.org/problemnew/show/P3811
大意
求 到 所有数在 意义下的乘法逆元
思路
乘法逆元是啥?
。。。
听说过倒数吗? 的倒数就是 吧?它们的乘积是1,而乘法逆元也有点像倒数。。。
我们假设
的乘法逆元为
,那么
对的,就是比倒数多模了一个
,而且这里的
皆为自然数
那么问题来了,到底怎么去求它呢?本蒟蒻由于太弱了,暂时只听说过四种勉强会两种。。。
先安利一波大佬博客: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);
}
}