您的位置:首页 > 其它

uva 10673 Play with Floor and Ceil 数学

2016-04-22 09:28 190 查看

题目:

C - Play with Floor and Ceil
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld
& %llu

x = p xk + q xk

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 nd integers p and q that satis es the given equation.

Input

The rst 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 youd 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,

p

x

and

q

x

k

k

t in a 64 bit signed integer.

Sample Input

3

5 2

40 2

24444 6

Sample Output

1 1

1 1

0 6

题目大意:

给x和k两个值求 p 和q两个整数使得x=p*x/k(下限)+q*x/k(上限)成立

题目思路:

做数学题要先化解,尽可能减少变量,否则直接暴力为o(n^2)

题目求解:

假设x/k(下限)为dx 上限为 ux

原式 x*k=p*dx+q*(dx+ux-dx)

x*k=(p+q)*dx+(ux-dx)*q

假设p+q==k

(x-dx)*k=(ux-dx)*q

化解为只有一个未知量

程序:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int ci;
scanf("%d",&ci);
while(ci--)
{
long long int x,k,x_low,x_high;
scanf("%lld%lld",&x,&k);
x_low=x/k*k;
x_high=(x/k+1)*k;
int n=(x-x_low)*k/(x_high-x_low);
printf("%d",k-n);
printf(" %d\n",n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: