const int maxn = 700000; //1 到10000007共有60万多个素数
const int maxnu = 10000007; //整数范围内
bool is_prime[maxn]; //判断是否为素数
int prime[maxnu]; //保存素数
int p; //保存素数的个数
void seive()
{
for(int i = 0;i < maxnu;i++)is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for(int i = 2;i <= n;i++)
{
if(is_prime[i])
{
prime[p++] = i;
for(int j = i * 2; j <= n; j += i)
//是i 的倍数的都不是素数了
is_prime[j] = false;
}
}
经典题目 sdnu上面的求最大公约数变形
http://www.acmicpc.sdnu.edu.cn/problem/show/1132
/*
已知
a = x * b;
c = y * b;
x > y;
x % y != 0;
则所求为:
从1到sqrt(a / b)找最小的一个(a / b)除不尽的素数 y;
证明:
1.如果x是素数,则y = 2;在0 到sqrt(x)范围内
2.如果x不是素数,则在0 到sqrt(x)范围内有至少一个y会除x不余0(想一下为什么)
*/
#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long LL;
const int maxn = 700000;
const int maxnu = 10000007;
bool is_prime[maxnu];
int prime[maxn];
int p = 0;
//素数筛选
void Is_prime()
{
for(int i = 0;i < maxnu;i++)is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for(int i = 2;i <= maxnu;i++)
{
if(is_prime[i]){
prime[p++] = i;
for(int j = 2 * i;j <= maxnu;j += i)is_prime[j] = false;
}
}
}
int main()
{
LL a,b,c,x;
LL n;
Is_prime();
int y;
scanf("%I64d",&n);
while(n--)
{
scanf("%I64d%I64d",&a,&b);
x = a / b;
for(int i = 0;i < p - 1;i++)
{
if(x % prime[i] != 0)
{
y = prime[i];
break;
}
}
printf("%I64d\n",y * b);
}
return 0;
}