7-8 2020 CCPC Wannafly Winter Camp Day1 H. 最大公约数

这是一道钓鱼小王子,秒出的题,至今我也不会证明。
有三个人,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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值