HDU 6624 fraction【数论】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6624
题目大意:给定 p , x p,x p,x,存在两整数 a , b a,b a,b,求解满足 a &lt; b ,   a ≡ b x ( m o d   p ) a&lt;b,\ a≡bx(mod \ p) a<b, abx(mod p)的最小值 b b b

思路:
a = b x − c p a=bx-cp a=bxcp,则存在不等式 0 ≤ b x − c p ≤ b 0\le{bx-cp}\le{b} 0bxcpb
变换一下得到: p x &lt; b c &lt; p x − 1 \frac{p}{x}\lt{\frac{b}{c}\lt{\frac{p}{x-1}}} xp<cb<x1p,我们要解出这个不等式中的 m i n ( b ) min(b) min(b)值。
这时候可以想到运用类似于辗转相除法的形式来解决这个问题:
(1)令 z 1 = ⌊ p x ⌋ ,   z 2 = ⌊ p x − 1 ⌋ z_1=\lfloor\frac{p}{x}\rfloor,\ z_2=\lfloor\frac{p}{x-1}\rfloor z1=xp, z2=x1p
(2)如果 z 1 ! = z 2 z_1!=z_2 z1!=z2,则令 c = 1 , b = z 1 + 1 c=1,b=z_1+1 c=1,b=z1+1(因为不含等号,所以要加1)跳出循环。否则就执行(3)。
(3)不等式同步减掉 z 1 z_1 z1,不等式变为: p − z 1 ∗ x x &lt; b − z 1 ∗ c c &lt; p − z 1 ∗ ( x − 1 ) x − 1 \frac{p-z_1*x}{x}\lt{\frac{b-z_1*c}{c}\lt{\frac{p-z_1*(x-1)}{x-1}}} xpz1x<cbz1c<x1pz1(x1),分子分母翻转一下得到: x − 1 p − z 1 ∗ ( x − 1 ) &lt; c b − z 1 ∗ c &lt; x p − z 1 ∗ x \frac{x-1}{p-z_1*(x-1)}\lt{\frac{c}{b-z_1*c}\lt{\frac{x}{p-z_1*x}}} pz1(x1)x1<bz1cc<pz1xx,这个式子和最初得到的原式 ( p x &lt; b c &lt; p x − 1 ) (\frac{p}{x}\lt{\frac{b}{c}\lt{\frac{p}{x-1}}}) (xp<cb<x1p)是不是有点相像,两式对应一下递归就 o k ok ok了。

证明:算法正确性菜鸡无法证明,很像辗转相除法。
AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p,xx;
ll b,c;
void solve(ll p,ll x,ll &b,ll &c,ll pp,ll y)//y=x-1
{
    ll z1=p/x;
    ll z2=pp/y;
    if(z1!=z2){
       c=1;
       b=z1+1;//因为不等式不带等号
       return ;
    }
    p-=z1*x;
    pp-=z1*y;
    b-=c*z1;
    solve(y,pp,c,b,x,p);
    b+=c*z1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
       scanf("%lld%lld",&p,&xx);
       b=0;
       c=0;
       solve(p,xx,b,c,p,xx-1);//按照不等式从左到右依次传参
       ll a=b*xx-c*p;
       printf("%lld/%lld\n",a,b);
    }
    return 0;
}
/*
3
11 7
998244353 554580197
998244353 998244352

2/5
8/9
499122176/499122177
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值