两种求解逆元的方法:快速幂和扩展欧几里得算法,时间复杂度都为O(log_{2}^{p})是模数

这道题目需要求从所有数对pP的乘法逆元,时间复杂度为O(n\times log_{2}^{p}),最坏情况是,给卡超时了
正确的解法是线性逆元,在的时间复杂度求出从所有数对的乘法逆元,该方法是线性从前推后,所以与时间复杂度与p没有关系

现在如何求niyuan[i]?
p=k\times i +r
,两边同时乘以,则
,化简为k \times niyuan[r] + niyuan[i] \equiv 0 \ (mod\ p)
所以k \times niyuan[r] + niyuan[i] \equiv 0 \ (mod\ p)
因为
所以,因为为负数,所以niyuan[i]\equiv (p - \lfloor\frac{p}{i} \rfloor) \times niyuan[p\ \%\ i]\ (mod\ p)
总代码:
#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define HelloWorld IOS;


signed main(){
    HelloWorld;

    int n, p; cin >> n >> p;
    vector<int> niyuan(n + 1);
    niyuan[1] = 1;
    for(int i = 2; i <= n; i ++) niyuan[i] = ((p - p / i) * niyuan[p % i]) % p;
    for(int i = 1; i <= n; i ++) cout << niyuan[i] << endl;
    return 0;
}