1. 程式人生 > 實用技巧 >hdu6624 fraction 輾轉相除法

hdu6624 fraction 輾轉相除法

題意:給定p和x,求最小的b,使 abx(modp)。

思路:先把式子進行轉化:

    abx(modp)

    a=bx - pc

    ∵ 0 < a < b

    ∴ 0 < bx - pc < b

    即 $\frac{p}{x}$ $\leq$ $\frac{b}{a}$ < $\frac{p}{x-1}$

   這樣就轉化為:求滿足值在所給的兩分數之間時,最小的分子分母是多少(可以用輾轉相除法求解)。

程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace
std; 3 typedef long long ll; 4 // 滿足 a/b <= x/y < c/d 的最小的x和y 5 void solve(ll a,ll b,ll c,ll d,ll &x,ll &y){ 6 ll z=(a+b-1)/b; 7 if(z<=c/d){ 8 x=z,y=1; 9 return; 10 } 11 a-=b*(z-1),c-=d*(z-1); 12 solve(d,c,b,a,y,x); 13 x+=y*(z-1); 14 } 15 int
main() 16 { 17 ll p,x; 18 int T; 19 scanf("%d",&T); 20 while(T--){ 21 scanf("%lld%lld",&p,&x); 22 ll a,b,c; 23 solve(p,x,p,x-1,b,c); 24 a=b*x-p*c; 25 printf("%lld/%lld\n",a,b); 26 } 27 return 0; 28 }