1. 程式人生 > 實用技巧 >洛谷P3811題解

洛谷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; }