6.阶乘的和
- 题目描述
输入格式
输入的第一行包含一个整数 n 。
第二行包含 n 个整数,分别表示 Ai,相邻整数之间使用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
样例输入
3
2 2 2
样例输出
3
- 思路分析
本题是要求解n个数Ai的阶乘的和的可以用m!表示的最大因数,对于此题,我们先找找规律
2!+ 2!+ 2!= 2!* (1 + 1 + 1) = 2!* 3 = 3!
我们可以看到,先提取最小的Ai作为公因数,剩余的元素和为3,刚好可以凑成3的阶乘
4!+5!+6! = 4!* (1 + 5 + 5*6)
由于(1 + 5 + 5*6)没有公因式,因此此式子的结果只能为4!
2!+ 2!+ 2!+ 3!+ 3!+ 3! = 2! * (1 + 1 + 1 + 3 + 3 + 3) = 2! * (3 + 3 + 3 + 3) = 2! * 3 * (1 + 1 + 1 + 1)
= 2 * 3 * 4 = 4!
根据上述的规律我们不难看出,每次我们提取最小的阶乘为公因式,剩余括号中的和如果为相同的数,我们可以再次提取公因式看它是否为最小阶乘公因式数大1的数,如果是便可以组成新的值,否则还是上述提取的最小公因式
- Java代码实现
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//表示要输入整数的个数
long[] nums = new long[n];//用来记录n个Ai的值
long min = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
nums[i] = sc.nextLong();
if (nums[i] < min) min = nums[i];//找出最小的参数
}
long m = min;//m!表示最小因数
long count = 0;//表示在nums中有几个是相同的m
while (true) {
count = count / m;
for (int i = 0; i < n; i++) {//与最小公因数相等的数的个数
if (nums[i] == m) count++;
}
if (count != 0 && count % (m + 1) == 0) m++;
//将相同m提取之后如果count == m+1,说明此时可以提取m+1!为最小因数,因为m!为最小的因数,剩余因数
//一定大于m!,因此也包含m+1,所以可以提出来(m+1)!作为新的因数
else break;
}
System.out.println(m);
}