鹿我所录的博客

记录我在学习C#中的点点滴滴,记录下以备后来人借鉴。

 

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

 

posted on 2020-10-25 09:52  鹿我所录  阅读(63)  评论(0编辑  收藏  举报

导航