题目大意:
给你N组数,通过组合得到一个数组B.求数组B的Gcd.
组合方式就是一组数中取一个数加和。
思路:
问题关键点肯定在于差值,所以我们现在将一个组先按照数字大小从小到大排序,然后我们将这个组相邻的两个数的差值求出来,然后求一个Gcd.
然后每一组都得到一个gcd值,再将所有组的gcd值求一个gcd,设定为ans。
我们知道,结果肯定是要小于等于a【0】+b【0】+c【0】+d【0】+........+z【0】的;
那么我们再将ans和a【0】+b【0】+c【0】+d【0】+........+z【0】求一次gcd即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long int
ll a[500];
ll gcd(ll x,ll y)
{
if(y==0)return x;
else return gcd(y,x%y);
}
int main()
{
ll kase=0;
ll t;
scanf("%lld",&t);
while(t--)
{
ll n;
scanf("%lld",&n);
ll sum=0,gc=0;
for(ll i=0;i<n;i++)
{
ll mi;
scanf("%lld",&mi);
for(ll j=0;j<mi;j++)
{
scanf("%lld",&a[j]);
}
sort(a,a+mi);
sum+=a[0];
for(ll j=1;j<mi;j++)
{
gc=gcd(gc,a[j]-a[j-1]);
}
}
gc=gcd(gc,sum);
printf("Case #%lld: %lld\n",++kase,gc);
}
}
本文介绍了一种求解由多个数值组通过特定方式组合而成的数组B的最大公约数(GCD)的问题。通过先计算每组数值差值的GCD,再对这些GCD求总GCD,并最终与各组首个元素之和的GCD相结合得出结果。

被折叠的 条评论
为什么被折叠?



