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

来源:互联网 发布:用jq优化页面加载速度 编辑:程序博客网 时间:2024/06/05 02:22

题意:

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

思路:

http://blog.csdn.net/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;}
0 0