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

本文介绍了一种使用扩展欧几里得定理解决特定数学问题的方法,即给定x和k,求解使得ax + by = gcd(a, b)成立的p和q。通过提供AC代码,详细解释了实现过程。
题意:

给定x, k,求p, q使得:
这里写图片描述

思路:

http://blog.youkuaiyun.com/fioman/article/details/2455698
利用扩展的欧几里得定理,ax + by = gcd(a, b);x, y一定有整数解。

AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
void gcd(int a,int b,int& d,int& x,int& y) {
    if(!b) {
        d = a, x = 1, y = 0;
    }else {
        gcd(b, a%b, d, y, x);
        y -= x*(a/b);
    }
}
int main() {
    int T, a, b, d, p, q, x, k;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d",&x,&k);
        a = (int)floor((double)x / k);
        b = (int)ceil((double)x / k);
        gcd(a,b,d,p,q);
        p *= (x / d);
        q *= (x / d);
        printf("%d %d\n",p,q);
    }
    return 0;
}
### 关于 Codeforces 中涉及 FloorCeil 的实现 在编程竞赛中,`floor` 和 `ceil` 函数通常用于处理浮点数运算的结果。这些函数分别表示向下取整和向上取整的操作。以下是基于 C++ 实现的一个典型例子: #### 使用标准库中的 floorceil C++ 提供了 `<cmath>` 库来支持数学操作,其中包括 `floor()` 和 `ceil()` 函数。 ```cpp #include <iostream> #include <cmath> // 包含 math.h 头文件以使用 floorceil using namespace std; int main() { double num; cin >> num; // 计算并打印 floor 值 cout << "Floor value: " << floor(num) << endl; // 计算并打印 ceil 值 cout << "Ceil value: " << ceil(num) << endl; return 0; } ``` 上述代码展示了如何通过输入一个浮点数值计算其对应的地板值(`floor`)以及天花板值(`ceil`)。需要注意的是,在某些情况下可能需要手动调整精度或者考虑边界条件[^1]。 #### 手动实现 floorceil 功能 如果不想依赖外部库,则可以自己编写逻辑完成相同的功能。下面是一个简单版本的手动实现方式: ```cpp double custom_floor(double x){ if(x >= 0) return (int)x; else return ((int)(x)-((int)(x)!=x)); } double custom_ceil(double x){ if( x > 0 && x != (int)x ) return (int)x +1 ; else return (int)x ; } ``` 此方法适用于基本场景下的需求满足;但对于极端情况比如非常接近整数的小数部分仍需谨慎对待[^2]。 ### 结论 无论是采用内置的标准库还是自定义算法实现 floor/ceil 运算都各有优劣之处。前者更加简洁明了易于维护更新,而后者则提供了更大的灵活性允许开发者针对特定应用环境做出优化改进措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值