这是一道钓鱼小王子,秒出的题,至今我也不会证明。
有三个人,A,B,C,其中 A 和 B 共享了一个神秘的数字 k,已知 1≤k≤n。
现在 A 和 C 说:“k 的值等于 x”。
C 不太信任 A,于是想向 B 确认一下 k 是否真的等于 x。B 虽然不想直接把 k 的值告诉 C,但是 B 允许 C 给出一个正整数 y(注意 y 可以大于 n),然后 B 会回答 gcd(k,y)。
现在给出 k,n,你需要帮助 C 决定这样的 y 的取值,使得 C 一定可以通过 B 的回答来判断 A 有没有撒谎。如果这样的 y 有多个,你需要输出最小的那个。
输入格式:
输入第一行是一个整数 T(1≤T≤50)。
对于每组数据,输入一行两个整数 n,k(1≤k≤n≤500)。
输出格式
对于每组数据,输出一行一个整数,表示答案。如果满足条件的 y 不存在,则输出 −1。
输入样例:
3
10 1
10 4
10 7
输出样例:
210
8
7
题解:就是求 k * prime(i)
其中prime(i)<=n/k
数有点大,注意用大数。就用python写了。
maxn=1100
cnt=0
prime=[0 for i in range(1100)]
ha=[False for i in range(1100)]
def Prime():
global cnt,maxn,prime,ha
ha[1]=1
for i in range(2,maxn):
if not ha[i]:
prime[cnt]=i;cnt+=1
for j in range(cnt):
if prime[j]*i>=maxn:
break
ha[prime[j]*i]=True
if i%prime[j]==0:
break
def main():
global cnt,maxn,prime,ha
Prime()
t=int(input())
while t>0:
t-=1
a=list(map(int,input().split()))
ans=a[1]
for i in range(cnt):
if prime[i]>(a[0]//ans):
break
a[1]=a[1]*prime[i]
print("%d"%(a[1]))
main()