【题解】乘法逆元2
题解 乘法
2023-06-13 09:11:42 时间
题目描述
给定 n 个正整数
,求它们在模 p 意义下的乘法逆元。
由于输出太多不好,所以将会给定常数 k,你要输出的答案为:
答案对 p 取模。
输入格式
第一行三个正整数 n,p,k,意义如题目描述。 第二行 n 个正整数 aia_iai,是你要求逆元的数。
输出格式
输出一行一个整数,表示答案。
输入输出样例
输入 #1
6 233 42
1 4 2 8 5 7
输出 #1
91
说明/提示
对于 30% 的数据,
对于 100% 数据,
保证 p 为质数。
题目分析
将题目要求的式子展开
我们进行通分,可得
同余连续性对于除法来说是不成立的,可以利用逆元,将除法转化为乘法。
,x为b的逆元。
计算a/ba/ba/b这样的除法算式,可以先把a,b各自对模数p取模,再计算
作为最终的结果。
利用费马小定理求逆元:
代码实现
#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.
相关文章
- 剑指Offer题解 - Day16
- 剑指Offer题解 - Day24
- 剑指Offer题解 - Day26
- 剑指Offer题解 - Day48
- 2109-全国大学生电子设计竞赛-F-纸张数识别(内含arduino代码以及题解)[通俗易懂]
- LeetCode 700题 题解答案集合 Python
- Luogu P4772 灰化肥,会挥发 题解
- Luogu P1606 [USACO07FEB]Lilypad Pond G 题解
- Luogu 2019三月月赛 P5239 回忆京都 题解
- 三校集训Part1 QZEZ Day2 A洗牌 题解
- 「NOIP模拟赛」欧拉口算 题解
- YbtOJ 维护集合 题解
- Luogu P4088 [USACO18FEB]Slingshot P 题解
- 【题解】Running for Gold
- 【动态规划】LeetCode 题解:494-目标和