给出x, k, 求 x = p * 下取整(x / k) + q * 上取整(x / k) 的一组解p, q
直接用扩展欧几里得即可
代码:
# include <iostream>
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <cmath>
using namespace std;
typedef long long LL;
int x, k;
int exgcd(int a, int b, int& x, int& y) {
if (!b) {
x = 1; y = 0;
return a;
}
int g = exgcd(b, a % b, y, x);
y -= a / b * x;
return g;
}
int main(void)
{
int T; scanf("%d", &T);
while (T-- && scanf("%d %d", &x, &k)) {
int a = (int)floor(x * 1.0 / k);
int b = (int)ceil(x * 1.0 / k);
int p, q;
int g = exgcd(a, b, p, q);
p = p * x / g; q = q * x / g;
printf("%d %d\n", p, q);
}
return 0;
}
本文介绍如何使用扩展欧几里得算法来求解形如 x=p*下取整(x/k)+q*上取整(x/k) 的方程,并提供了一段C++代码实现。该算法首先计算x除以k的下取整和上取整值,然后通过扩展欧几里得算法找到p和q的一组解。
566

被折叠的 条评论
为什么被折叠?



