洛谷P3811题解
原题:
思路:
没啥思路
已经把思路贴我脸上了
求逆元
这玩意是很重要的东西,一旦涉及到除法取模,就要用逆元转化成乘法来取模
原因是:
(a+b) mod c=((a mod c)+(b mod c))mod c
(a-b) mod c=((a mod c)-(b mod c))mod c
(a*b) mod c=((a mod c)*(b mod c))mod c
(ab) mod c=((a mod c)b)mod c
但就是没有(a/b) mod c=((a mod c)/(b mod c))mod c
所以除法真是个恶心人的东西
为了解决除法取模,我们当然可以把a/b计算出来
但是误差太大了
于是乘法逆元应运而生,这玩意能把除法换成乘法,然后取模
具体就是
把(a/b) mod c变成(a*(b的逆元)) mod c
这道题是要求我们用线性时间求出一堆数的逆元
下附代码
代码:
#include <bits/stdc++.h> using namespace std; long long n,p; long long inv[3000050]; int main() { scanf("%lld%lld",&n,&p); inv[1]=1; cout << 1 << endl; for(int i=2;i<=n;i++) { inv[i]=(long long)(p-p/i)*inv[p%i]%p; printf("%lld\n",inv[i]); } return 0; }