P5431 【模板】乘法逆元2

题目

题目

思路

前缀积线性求逆元即可。
设要求 a 1 , a 2 , a 3 , … , a n a_1,a_2,a_3,…,a_n a1,a2,a3,,an的逆元。
那么设 s i = s i − 1 ∗ a i s_i=s_{i-1}*a_i si=si1ai,我们求 s n s_n sn的逆元,则 1 s i 1\over{s_i} si1可线性递推,进一步可得出 1 a i 1\over{a_i} ai1
code:

#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
long long n,p,k,a[5000006][3],o,s;
inline long long read()
{
	long long ans=0;
	char u=getchar();
	while (u>'9'||u<'0') u=getchar();
	while (u<='9'&&u>='0') ans=ans*10+u-'0',u=getchar();
	return ans;
}
pair<long long,long long> exgcd(long long a,long long b)
{
	if (b==0) return pair<long long,long long> (1,0);
	pair<long long,long long> tmp=exgcd(b,a%b);
	return pair<long long,long long> (tmp.second,tmp.first-a/b*tmp.second);
}
long long ff(long long x)
{
	pair<long long,long long> tmp=exgcd(x,p);
	return (tmp.first%p+p)%p;
}
int main()
{
	n=read(),p=read(),k=read();
	o=k;
	a[0][1]=a[0][2]=a[n+1][1]=a[n+1][2]=1;
	for (long long i=1;i<=n;i++)
	{
		a[i][0]=read();
		a[i][1]=a[i-1][1]*a[i][0]%p;
	}
	for (long long i=n;i>=1;i--) a[i][2]=a[i][0]*a[i+1][2]%p;
	for (long long i=1;i<=n;i++)
	{
		s=(s+o*a[i-1][1]%p*a[i+1][2]%p)%p;
		o=o*k%p;
	}
	printf("%lld",s*ff(a[1][2])%p);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值