首页 > 其他 > 详细

Luogu5431 【模板】乘法逆元2

时间:2020-07-31 22:45:18      阅读:128      评论:0      收藏:0      [点我收藏+]

https://www.luogu.com.cn/problem/P5431

乘法逆元

注意,不能暴力算,否则必然\(TLE\)

需要先通分,然后简单计算,从而优化时间复杂度

还需要火车头

\(C++ Code:\)

#pragma GCC optimize(O2)
#pragma GCC optimize(O3)
#pragma GCC optimize(Ofast)
#pragma GCC optimize("inline")
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 5000005
using namespace std;
int n,p,k;
int a[N],qz[N],hz[N];
template<typename T>
inline void read(T &x) 
{
    x=0;
    T otz=1,ch=getchar();
    while (!isdigit(ch)&&ch!=‘-‘) 
        ch=getchar();
    if(ch==‘-‘) 
    {
    	otz=-1;
        ch=getchar();
    }
    while (isdigit(ch)) 
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    x*=otz;
}
template<typename T>
inline void write(T x)
{
    if (x<0)
    {
        x=-x;
        putchar(‘-‘);
    }
    if (x>=10)
        write(x/10);
    putchar(x%10+‘0‘);
}
ll ksm(ll x,ll y)
{
    ll ans=1;
    while (y)
    {
        if (y & 1)
            ans=ans*x%p;
        x=x*x%p;
        y >>=1;
    }
    return ans;
}
int main()
{
    read(n),read(p),read(k);
    qz[0]=1;
    for (int i=1;i<=n;i++)
    {
        read(a[i]);
        qz[i]=(ll)qz[i-1]*a[i]%p;
    }
    hz[n+1]=1;
    for (int i=n;i>=1;i--)
        hz[i]=(ll)hz[i+1]*a[i]%p;
    ll s1=ksm(qz[n],p-2);
    ll s=1,ans=0;
    for (int i=1;i<=n;i++)
    {
        s=s*k%p;
        ans=(ans+s*qz[i-1]%p*hz[i+1]%p)%p;
    }
    ans=ans*s1%p;
    write(ans),putchar(‘\n‘);
    return 0;
}

Luogu5431 【模板】乘法逆元2

原文:https://www.cnblogs.com/GK0328/p/13412151.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!