[乘法逆元 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;

  代码:

 

 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 }
Sunshine's

 

posted @ 2017-11-08 21:57  昤昽  阅读(137)  评论(0编辑  收藏  举报