她可以进行任意次操作,每次选择数组中的两个元素
所有操作结束后,请你输出最小的数组元素之和。
int n = read_uint();
int min = 0;
for (int i = 0; i < n; i++) {
a[i] = read_uint();
if (a[i] < a[min]) min = i; // 找到最小值
}
for (int i = 0; i < n; i++) {
if (i == min || a[i] == 0) continue;
a[i] %= a[min]; // 整除。那么gcd等于a[min],直接剔除重复的a[i]
if (a[i] == 0) continue; // 值为0将不再参与任何运算
a[i] = gcd(a[i], a[min]);
if (a[i] == 1) { // 互质
write_uint(n); // 直接输出答案
putchar('\n');
return 0;
} else { // 只要不整除,gcd一定小于a[min]
a[min] = 0; // 按照规则,a[min]也会变成gcd,剔除掉重复的a[min]
min = i; // 所以它成为新的最小值
i = -1; // 从头开始遍历
}
}
write_ulong((long)n * a[min]); // 注意乘积超出了int范围
putchar('\n');