[2019杭电多校第五场][hdu6624]fraction

Posted sainsist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2019杭电多校第五场][hdu6624]fraction相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6624

题意为求最小的b满足$a*b^-1\equiv x(modp)$.

把式子化简一下:

$a\equiv b*x(modp)$

$a=b*x-p*y$

$\because 0<a<b$

$\therefore 0<b*x-p*y<b$

$0<b*x-p*y\Rightarrow \fracpx<\fracby$

$b*x-p*y<b\Rightarrow \fracby<\fracpx-1$

$\therefore \fracpx<\fracby<\fracpx-1$

这样题目就转化成求最小的b,y满足上式。

如果当前[p/x,p/(x-1)]之间有整数,则$b=\left \lfloor p/x \right \rfloor+1,y=1$。

如果没有则可以辗转相除来递归求解。

例如:p=11,x=7。

$\frac117<\fracby<\frac116$

则化为真分数后在求倒数。

$\frac65<\fracyb-y<\frac74$

再次化为真分数后求倒数。

$\frac43<\fracb-y2*y-b<5$

此时[4/3,5]内有整数,则回溯得到答案。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<queue>
 7 using namespace std;
 8 typedef long long ll;
 9 void f(ll a, ll b, ll c, ll d, ll& x, ll& y)
10     ll q = a / b + 1;
11     if (q <= c / d)
12         x = q;
13         y = 1;
14         return;
15     
16     q--;
17     a -= q * b; c -= q * d;
18     f(d, c, b, a, y, x);
19     x += q * y;
20     return;
21 
22 int main()
23     int t;
24     scanf("%d", &t);
25     while (t--)
26         ll b, y, a, p, x;
27         scanf("%lld%lld", &p, &x);
28         f(p, x, p, x - 1, b, y);
29         a = b * x - y * p;
30         printf("%lld/%lld\n", a, b);
31     
32     return 0;
33 

 

以上是关于[2019杭电多校第五场][hdu6624]fraction的主要内容,如果未能解决你的问题,请参考以下文章

[2019杭电多校第五场][hdu6628]permutation 1

[2019杭电多校第五场][hdu6629]string matching

[2019杭电多校第五场][hdu6630]permutation 2

[2019杭电多校第五场][hdu6625]three arrays(01字典树)

暑假N天乐比赛篇 —— 2019杭电暑期多校训练营(第五场)

2019 杭电多校 第五场