XTU 1220 A+B Again

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值