1. 程式人生 > >hiho1530(乘法逆元)(擴展歐幾裏得)

hiho1530(乘法逆元)(擴展歐幾裏得)

利用 fault clu 技術分享 GC pos exgcd 其中 div

#1530 : 分數取模

時間限制:1000ms 單點時限:10000ms 內存限制:256MB

描述

給定三個正整數 abp,滿足 bp 互質。這時分數 a / b 除以 p 的余數,即 a / b MOD p 可以定義為 a × b-1 MOD p

其中b-1b 的逆元,它滿足 1 ≤ b-1 < pb × b-1 ≡ 1 MOD p,滿足上述條件的 b-1有且僅有一個。

例如 2-1 ≡ 4 MOD 7,因為2 × 4 ≡ 1 MOD 7; 3-1 ≡ 3 MOD 8,因為3 × 3 ≡ 1 MOD 8。

於是我們可以利用b-1求出a / b MOD p

,例如: 3 / 2 MOD 7 = 3 × 2-1 MOD 7 = 3 × 4 MOD 7 = 5

給定三個正整數 abp,滿足 bp 互質,求 a / b MOD p

輸入

第一行包含3個正整數,abp 滿足 bp 互質。

對於30%的數據,1 ≤ a, b < p ≤ 100

對於80%的數據,1 ≤ a, b < p ≤ 100000

對於100%的數據,1 ≤ a, b < p ≤ 1000001333

輸出

輸出 a / b MOD p的值。

樣例輸入
3 2 7
樣例輸出
5

這個代碼使用擴展gcd求乘法逆元。

技術分享圖片
#include<cstdio>
long
long exgcd(long long a,long long b,long long &x,long long &y) {//求出gcd(a,b)順帶求出一組特解使得ax+by=gcd(a,b) if(b==0) { x=1; y=0; return a; } int r=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r; } int main() { long long a,b,p,x,y; scanf(
"%lld%lld%lld",&a,&b,&p); long long r=exgcd(b,p,x,y); printf("%lld\n",a*((x+p)%p)%p); return 0; }
View Code








hiho1530(乘法逆元)(擴展歐幾裏得)