标签:
| Accepted : 15 | Submit : 243 | |
| 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
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
int a,b,su;
vector<int>s;
vector<int>all;
void solve()
{
int temp=b;
if(a>=temp){ cout<<"-1"<<endl; return; } //特判
//找质因数:
for(int i=2;i*i<=temp;i++)
{
if(temp%i==0)
{
s.push_back(i);
while(temp%i==0) temp/=i;
}
}
s.push_back(b); // 因为b本身可能就是素数,所以要在vector里加b,就算不是素数,也对结果无影响。
for(int i=0;i<s.size();i++) //生成s.size()个约数。
{
su=s[i];
int m=a/su+1;
all.push_back(su*m);
}
sort(all.begin(),all.end());
for(int i=0;i<all.size();i++)
if(all[i]>a) {cout<<all[i]-a<<endl;return ;}
}
int main()
{
int _;
cin>>_;
while(_--)
{
cin>>a>>b;
s.clear();
all.clear();
solve();
}
return 0;
}
xtuoj A+B Again(在某个数中找大于m的最小约数)
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/42639783