[乘法逆元 LuoGu3811]
题目描述
给定n,p求1~n中所有整数在模p意义下的乘法逆元。
输入输出格式
输入格式:
一行n,p
输出格式:
n行,第i行表示i在模p意义下的逆元。
1.快速幂求逆元.
∵ p 为素数,所以 a^(p-1)%p≡1(%p);
∴ a * a^(p-2)≡1(%p);
∴ 答案为 a^(p-2).
2.线性求逆元.
inv[x]:x 在模 P 意义下的逆元.
令 T=P/x ,K=P%x
则 T*x + K≡0(%P)
∴ -T*x ≡ K(%P)
∴ -T/K ≡ 1/x (%P)
∴ -T* inv[K]≡inv[x](%P)
即 inv[x]=(P-T)*inv[K]%P
inv[x]=(P-P/x)*inv[M%x]%P;
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //Copyright(C)Sunshine. 2 //2017.11.08 3 #include <cstdio> 4 #include <cstring> 5 const int N=3e6+1; 6 int inv[N],n,p; 7 inline void write(int x) 8 { 9 int s[19],top=0; 10 while(x)s[++top]=x%10,x/=10; 11 while(!top)s[++top]=0; 12 while(top)putchar(s[top--]+'0'); 13 } 14 int main() 15 { 16 scanf("%d %d",&n,&p); 17 inv[1]=1; 18 write(inv[1]); 19 putchar(10); 20 for(int i=2;i<=n;i++) 21 { 22 inv[i]=(long long)(p-p/i)*inv[p%i]%p; 23 write(inv[i]); 24 if(i!=n)putchar(10); 25 } 26 return 0; 27 }