首页 > 试题广场 >

N-GCD

[编程题]N-GCD
  • 热度指数:3857 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小明很喜欢数对,又很喜欢GCD(最大公约数)。所以他想尽办法创造了一种全新的最大公约数:
给出若干个数对(ai,bi),如果一个最大的质数x可以整除每一个数对中的至少一个数字并且这个数字大于1,那么x就称为这些数对的N-GCD。
现在小明给了你一些数对,希望你可以算出它们的N-GCD。

输入描述:


第一行一个数字n,表示数对的个数。

接下来n行,每行两个数字,用一个空格分隔,表示一个数对。

满足1<=n <=150000,1<=ai,bi<=2 * 10^9。





输出描述:
一个数字,这些数对的N-GCD;若N-GCD不存在,那么输出-1。
示例1

输入

3
2 2
3 6
7 8

输出

2
示例2

输入

2
18 12
3 24

输出

3
###素数表的可以通过
###DP未通过,40%case,显示语法错误和越界,有大佬能帮忙解答一下吗


def fig(num):
    if num==2:
        return True
    length = max(int(pow(num,0.5))+1,3)
    for i in range(2,length):
        if num%i==0:
            return False
    return True  
def dp(dui):
    def find_yue(dui,yue):
        if yue==[]:
            return -1
        if dui==[]:
            return yue
        new_yue = []
        for i in yue:
            if dui[0][0]%i==0 or dui[0][1]%i==0:
                new_yue.append(i)
        dui.remove(dui[0])
        return find_yue(dui,new_yue)


    yue = [i+1 for i in range(1,max(dui[0]))]
    out = find_yue(dui,yue)
    if out==-1:
        print(-1)
    else:
        lth = len(out)
        for i in range(lth):
            if fig(out[lth-i-1]):
                print(out[lth-i-1])
                break
def prtable(dui,mi):
    tab = []
    for i in range(2,mi+1):
        if fig(i):
            tab.append(i)
    for i in range(len(dui)):
        for j in tab:
            if dui[i][0]%j and dui[i][1]%j:
                tab.remove(j)
    if tab==[]:
        print(-1)
    else:
        print(tab[-1])
                
    return 0
if __name__=='__main__':
    n = int(input())
    dui = []
    mi=2*10e9
    for i in range(n):
        _dui = list(map(lambda x:int(x),input().split(' ')))
        mi = min(mi,min(_dui))
        dui.append(_dui)
    
    #dp(dui)
    prtable(dui,mi)

发表于 2020-07-30 16:58:41 回复(0)

分析

在读取数字的时候顺便计算下最小值min,之后找出[2,min]之间的素数,并从大到小遍历,判断该数能否整除除nums数组中每一个数对中的任意一个值。

from math import sqrt

def is_prime(a):
    for i in range(2,int(sqrt(a)+1)):
        if a%i==0:
            return False
    return True

N = int(input())
nums = []
min_val = 1e9
for i in range(N):
    val1,val2 = list(map(int,input().split()))
    min_val = min(min_val,val1,val2)
    nums.append([val1,val2])

primes = []
res = 1e9
for i in range(min_val,1,-1):
    if is_prime(i):
        primes.append(i)

for val in primes:
    satisfied = True
    for i in range(N):
        if nums[i][0]%val!=0 and nums[i][1]%val!=0:
            satisfied = False
            break
    if satisfied:
        res = val
        break

print(res) if res!=1e9 else print(-1)
发表于 2020-07-15 18:11:14 回复(0)