前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【题解】乘法逆元2

【题解】乘法逆元2

作者头像
fishhh
发布2022-08-31 14:52:30
2840
发布2022-08-31 14:52:30
举报
文章被收录于专栏:OI算法学习笔记OI算法学习笔记

题目描述

给定 n 个正整数

,求它们在模 p 意义下的乘法逆元。

由于输出太多不好,所以将会给定常数 k,你要输出的答案为:

答案对 p 取模。

输入格式

第一行三个正整数 n,p,k,意义如题目描述。 第二行 n 个正整数 aia_iai​,是你要求逆元的数。

输出格式

输出一行一个整数,表示答案。

输入输出样例

输入 #1

代码语言:javascript
复制
6 233 42
1 4 2 8 5 7

输出 #1

代码语言:javascript
复制
91

说明/提示

对于 30% 的数据,

对于 100% 数据,

保证 p 为质数。

题目分析

将题目要求的式子展开

我们进行通分,可得

同余连续性对于除法来说是不成立的,可以利用逆元,将除法转化为乘法。

,x为b的逆元。

计算a/ba/ba/b这样的除法算式,可以先把a,b各自对模数p取模,再计算

作为最终的结果。

利用费马小定理求逆元:

代码实现

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
using namespace std;
const int N=5e6+5;
typedef long long ll;
int n,p,k;
ll mypow(ll x,ll n,int M){//快速幂
	if(n==0) return 1%M;
	ll tmp=mypow(x,n/2,M)%M;
	if(n&1) return tmp*tmp%M*x%M;
	else return tmp*tmp%M;
}
int main(){
	ll a,fz=0,fm=1;
	scanf("%d%d%d",&n,&p,&k);
	ll cf=k%p;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a);
		//当前分子: 前面的分子 * 新分母 + 之前分母*当前分子 
		fz=(fz*a%p+fm*cf%p)%p;
		cf=cf*k%p;
		fm=fm*a%p;
	}
	printf("%lld",fz*mypow(fm,p-2,p)%p);
	return 0;
}

Q.E.D.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
  • 说明/提示
  • 题目分析
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档