题目背景
这是一道模板题
题目描述
给定n,p求1~n中所有整数在模p意义下的乘法逆元。
输入输出格式
输入格式:
一行n,p
输出格式:
n行,第i行表示i在模p意义下的逆元。
输入输出样例
输入样例#1:
10 13
输出样例#1:
1
7
9
10
8
11
2
5
3
4
说明
(1 leq n leq 3 imes 10 ^ 6, n < p < 20000528 1≤n≤3×10^6,n<p<20000528)
输入保证 p p 为质数。
逆元可以线性求:
inv(i)=((p-p/i)*inv[p%i])%p
也可以扩展欧几里得求
那么就是
ax+p(模数)y=1的解
也可以根据快速幂来求
根据费马小定理
逆元就是a^(p-2)
以上几种方法均需保证p为素数
#include<cstdio>
#include<algorithm>
#define LL long long
LL inv[3000053];
//int inv[MAXN];
void INV(int a,int p)
{
inv[1] = 1;
for (int i=2; i<=a; ++i)
inv[i] = (LL)((p-(p/i)%p)%p*inv[p%i]%p)%p;
}
int main() {
int n,p;
scanf("%d%d",&n,&p);
INV(n,p);
for(int i=1;i<=n;++i)
printf("%d
",inv[i]);
return 0;
}