uva 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

 

知道floor和ceil 就行。

floor向下取整 floor(1.9999) = 1;

同理。

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long LL;
 8 
 9 LL Ex_GCD(LL a,LL b,LL &x,LL& y)
10 {
11     if(b==0)
12     {
13         x=1;
14         y=0;
15         return a;
16     }
17     LL g=Ex_GCD(b,a%b,x,y);
18     LL hxl=x-(a/b)*y;
19     x=y;
20     y=hxl;
21     return g;
22 }
23 int main()
24 {
25     LL T;
26     LL a,b,c,g,x,y,n,m;
27     scanf("%d",&T);
28     while(T--)
29     {
30         scanf("%lld %lld",&n,&m);
31         a = (LL)floor(n/(double)m);/**向下取整floor(1.999) = 1  **/
32         b = (LL)ceil(n/(double)m);
33         c = n;
34         g = Ex_GCD(a,b,x,y);
35 
36         x=x*(c/g);
37         b=b/g;
38         x=x%b;
39         while(x<0) x=x+b;
40         c=c/g;
41         y=(c-x*a)/b;
42         printf("%lld %lld\n",x,y);
43     }
44     return 0;
45 }

 

 

posted @ 2014-05-22 20:26  芷水  阅读(253)  评论(0编辑  收藏  举报