题目描述
设有两个正整数集A和B,如果正整数n既是A中所有元素的公倍数,又是B中所有元素的公约数,则n为因子约数。
现在给出正整数集A和B,请编写程序找出因子约数的个数。
输入格式
输入共4行。
第1行,1个正整数,为正整数集A中元素的个数d。(1<=d<=50)
第2行,d个正整数,以空格隔开,为正整数集A的元素di。(1<=di<=1000000000)
第3行,1个正整数,为正整数集B中元素的个数m。(1<=m<=50)
第4行,m个正整数,以空格隔开,为正整数集B的元素mi。(1<=mi<=1000000000)
输出格式
输出共1行,1个非负整数,为因子约数的个数,如果没有因子约数则输出0。
样例输入
样例输出
引用libojie的解释:
本题是一个数学题。
考虑到第二组数的最小公倍数可能较大,而其必须为第一组数的约数,故考虑先计算第一组数的最大公约数ans。计算最大公约数应用欧几里德辗转相除法,先计算(a[1],a[2]),(a[2],a[3]),...(a[n-1],a[n]),然后对这n-1个最大公约数重复以上操作,直到剩下一个数,此数能整除原来的n个数,且为最大。
计算最小公倍数也是采用上述方法,利用[a,b]=a*b/(a,b)即可。一旦发现某个[a,b]不是最大公约数ans的约数,则断定n个数的最小公倍数不是ans的约数,不存在因子约数,立即输出0。这样避免了直接求最小公倍数,保证int类型不会越界。
借鉴其程序: