
线性递推求逆元
Published on | 7/29/2025 |
Created on | 12/17/2021 |
这道题中:P3811 【模板】乘法逆元 - 洛谷
要求模 意义下 至 所有整数的逆元,我们可以采用以下方法:
假设我们现在要求 : 设 ,其中 和 为整数,即为 除 的商和余数。有 , 。 显然有
同余式两边同乘 :
移项,再代入:
由于 ,我们肯定先前求过,用一个 数组来记录每个数的逆元,递推时直接检索即可。 同时我们要保证同余式右侧大于零,按照[[EXGCD]]中求不定方程最小非负整数解的方法即可:
递推起点是 ,当然循环要从 开始,题目保证了 且为质数,故无需考虑 的情况。
时间复杂度为
参考代码:
#include <cctype>
#include <cstdio>
#include <cstring>
#include <iostream>
//---//
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
typedef unsigned int u;
typedef long long ll;
typedef unsigned long long llu;
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define REP(i, a, b) for (ll i = a; i <= b; i++)
#define per(i, b, a) for (ll i = b; i >= a; i--)
const ll N = 3000005;
ll inv[N];
signed main() {
ll n, p;
scanf("%lld%lld", &n, &p);
REP(i, 1, n)
printf("%lld\n", inv[i] = i - 1 ? (-p / i * inv[p % i] % p + p) % p : 1);
}
// https://www.luogu.com.cn/record/60969822