首页 > 代码库 > uva 10673 Play with Floor and Ceil
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 }