[UVa 10673]Play with Floor and Ceil

Posted NaVi_Awson

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[UVa 10673]Play with Floor and Ceil相关的知识,希望对你有一定的参考价值。

题目大意

求不定方程 $$x = p \\lfloor {x \\over k} \\rfloor + q \\lceil {x \\over k} \\rceil$$ 的一组整数解,$x$,$k$给出。

题解

我们发现 $\\lfloor {x \\over k} \\rfloor$ 和 $\\lceil {x \\over k} \\rceil$ 只有两种情况:

1. 相差$1$,显然$gcd(\\lfloor {x \\over k} \\rfloor,\\lceil {x \\over k} \\rceil)=1$。显然有整数解。

2. 相等,则$k|x$,所以$gcd|x$,也有整数解。

用扩欧求出方程$$gcd(\\lfloor {x \\over k} \\rfloor,\\lceil {x \\over k} \\rceil) = p \\lfloor {x \\over k} \\rfloor + q \\lceil {x \\over k} \\rceil$$一组解,

最后将答案乘上$x \\over gcd$即可。

 1 #include <set>
 2 #include <map>
 3 #include <ctime>
 4 #include <cmath>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8 #include <cstdio>
 9 #include <string>
10 #include <cstring>
11 #include <cstdlib>
12 #include <iostream>
13 #include <algorithm>
14 #define LL long long
15 #define Max(a, b) ((a) > (b) ? (a) : (b))
16 #define Min(a, b) ((a) < (b) ? (a) : (b))
17 #define sqr(x) ((x)*(x))
18 using namespace std;
19 
20 LL t, x, k;
21 
22 LL exgcd(LL a, LL b, LL &x, LL &y) {
23     if (b == 0) {
24     x = 1, y = 0;
25     return a;
26     }
27     LL c = exgcd(b, a%b, x, y);
28     LL t = x;
29     x = y;
30     y = t-y*(a/b);
31     return c;
32 }
33 
34 int main() {
35     scanf("%lld", &t);
36     while (t--) {
37     scanf("%lld%lld", &x, &k);
38     LL p, q;
39     LL tmp = exgcd(x/k, x/k+(bool)(x%k), p, q);
40     printf("%lld %lld\\n", p*x/tmp, q*x/tmp);
41     }
42     return 0;
43 }

 

以上是关于[UVa 10673]Play with Floor and Ceil的主要内容,如果未能解决你的问题,请参考以下文章

Play with Floor and Ceil UVA - 10673(拓展欧几里得)

uva10673-Floor和Ceil

UVA 10129 Play on Words

UVA10129-Play on Words(欧拉路径)

Play on Words UVA - 10129

UVA1609-Foul Play(构造+递归)