2012-10-28 17:19:08Morris

[UVA][GCD] 10673 - Play with Floor and Ceil

Problem A
Play with Floor and Ceil

Input:
standard input
Output:
standard output
Time Limit:
1 second
 

Theorem

For any two integers x and k there exists two more integers p and q such that:

It’s a fairly easy task to prove this theorem, so we’d not ask you to do that. We’d ask for something even easier! Given the values of x and k, you’d only need to find integers p and q that satisfies the given equation.

 

Input

The first line of the input contains an integer, T (1≤T≤1000) that gives you the number of test cases. In each of the following T lines you’d be given two positive integers x and k. You can safely assume that x and k will always be less than 108.

 

Output

For each of the test cases print two integers: p and q in one line. These two integers are to be separated by a single space. If there are multiple pairs of p and q that satisfy the equation, any one would do. But to help us keep our task simple, please make sure that the values,  and fit in a 64 bit signed integer.

 

Sample Input                              Output for Sample Input

3

5 2

40 2

24444 6

1 1

1 1

0 6

 


Problem setter: Monirul Hasan, Member of Elite Problemsetters' Panel

Special Thanks: Shahriar Manzoor, Member of Elite Problemsetters' Panel


網路上很多都用 double 什麼的去做, 我這裡使用 gcd 去找, 並沒有發生 TLE 的情況, 那我要怎麼保證有解, 這個我就不方便講解了。

#include <stdio.h>
#define LL long long
void gcd(LL x, LL y, LL k) {
    LL t;
    LL flag = 1, la = 1, lb = 0, ra = 0, rb = 1;
    while(x%y) {
        if(flag) {
            la -= (x/y)*ra;
            lb -= (x/y)*rb;
        } else {
            ra -= (x/y)*la;
            rb -= (x/y)*lb;
        }
        t = x, x = y, y = t%y;
        flag = 1-flag;
    }
    if(!flag)    printf("%lld %lld\n", la*k/y, lb*k/y);
    else        printf("%lld %lld\n", ra*k/y, rb*k/y);
}
int main() {
    LL x, k;
    int t;
    scanf("%d", &t);
    while(t--) {
        scanf("%lld %lld", &x, &k);
        LL a, b;
        a = x/k, b = x/k + (x%k != 0);
        gcd(a, b, x);
    }
    return 0;
}