A+B Again
Accepted : 34 | Submit : 337 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
题目描述
上次趣味赛小明的a+b坑了不少不喜欢思考的同学,小明为了表示歉意, 这次出了道简单的a+b给大家当签到题,希望大家能开心刷题。 那么,题目来了!!!
求使得b/(a+x)为整数的最小正整数x的值。
输入
第一行是一个整数K(K≤10000),表示样例的个数。 以后每行一个样例,为两个正整数a,b(1≤a,b≤108)。
输出
每行输出一个样例的结果,如果不存在这样的x,输出-1。
样例输入
3 1 2 1 3 1 4
样例输出
1 2 1
解题思路:题目很简单,稍微化下简,就可以看出目就是求b的因子减去a的最小正整数,如果没有就输出-1。。
假设:b/(a+x)=n
nx=b-na
x=b/n-a
代码如下:
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
#define maxn 100001;
using namespace std;
int main()
{
int a,b,t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&a,&b);
int s=(int)sqrt(b),ans=111111111,f=0;
if(b<=a) {printf("-1\n"); continue;}
for(int i=s;i>=1;i--)
{
if(b%i!=0) continue;
if(b/i-a>0){ans=min(ans,b/i-a); f=1;}///因为i为一个因子,那么b/i也是一个因子
if(i-a>0){ans=min(ans,i-a); f=1;}///寻找最小的
}
if(f) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}