luogu P3811 【模板】乘法逆元

题目背景

这是一道模板题

题目描述

给定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 \times 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\n",inv[i]);
    return 0;
}
posted @ 2017-11-07 07:12  zzzzx  阅读(187)  评论(0编辑  收藏  举报