luoguP5431(離線逆元)

題目鏈接:https://www.luogu.org/problem/P5431

思路:運用前綴積離線求逆元

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <bitset>
#include <cmath>
#include <cctype>
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod ll(998244353)
#define pb push_back
#define eps 1e-6
#define lc d<<1
#define rc d<<1|1
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
const int N=5e6+8;
int n,p,k,a[N],pre[N],inv[N],inv_pre[N];
int gmod(int a,int b,int p)
{
    int res=1;
    while(b)
    {
        if(b&1) res=1ll*res*a%p;
        a=1ll*a*a%p,b>>=1;
    }
    return res;
}
inline int read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
int main()
{
    cin.tie(0);
    cout.tie(0);
    cin>>n>>p>>k;
    pre[0]=1;
    FOR(i,1,n) a[i]=read(),pre[i]=1ll*pre[i-1]*a[i]%p;
    inv_pre[n]=gmod(pre[n],p-2,p);
    FOL(i,n,1)
    {
        inv[i]=1ll*pre[i-1]*inv_pre[i]%p;
        inv_pre[i-1]=1ll*inv_pre[i]*a[i]%p;
    }
    int ans=0;
    for(int i=1,qw=k;i<=n;i++)
    {
        ans=(1ll*inv[i]*qw%p+ans)%p;
        qw=1ll*qw*k%p;
    }
    cout<<ans<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章