两种求解逆元的方法:快速幂和扩展欧几里得算法,时间复杂度都为
,
是模数
这道题目需要求从
到
所有数对
的乘法逆元,时间复杂度为
,最坏情况是
,给卡超时了
正确的解法是线性逆元,在
的时间复杂度求出从
到
所有数对
的乘法逆元,该方法是线性从前推后,所以与时间复杂度与
没有关系
现在如何求
?
设
即
,化简为
所以
因为
,
所以
,因为为负数,所以
总代码:
#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;
}



京公网安备 11010502036488号