问题描述
给定 n 个数 Ai,问能满足 m! 为 ∑i=1n(Ai!)的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 1×2×3×⋯×m。
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数,分别表示 Ai,相邻整数之间使用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
样例输入
3
2 2 2
样例输出
3
评测用例规模与约定
对于 40% 的评测用例,n≤5000;
对于所有评测用例,1≤n≤105,1≤Ai≤109。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 2s | 256M |
Python3 | 3s | 256M |
PyPy3 | 3s | 256M |
Go | 3s | 256M |
JavaScript | 3s | 256M |
解题思路
题目解读:求能满足n个数的阶乘之和的最大因数(因数是指整数a除以b(b!=0)的商正好是整数而没有余数,称b是a的因数)。 请在此处填写你的解题思路 首先,阶乘可以合并:1!+1!+1!+1!+1!+1!=2!+2!+2!=3!,即:2=21!,3=32!......(1) 所以可以通过阶乘的合并来求这个因数:先把这些阶乘从小到大排列,不断地合并,知道无法合并时,这个合并后的最小阶乘值就是所求因数。(毕竟(n+1)!=(n+1)n!) 而因为(1),所以:如果定义i为阶乘值,则它可以合并为(i+n)!的条件是(i!的个数)%(i+1)==0,可以合并为(i!的个数)/(i+1)个(i+1)! 比如说i=3,且共有4个i!,即3!+3!+3!+3!=43!=4!,它就可以合并为4/(3+1)=1个4!;倘若共有20个i!,则它们就可以合并为20/4=5个4!之和,即5! 其次,因为所给的评测用例规模与约定中对于所有的评测用例而言:n>=1&&n<=10^5,Ai>=1&&Ai<=10^9 所以我们可以将Ai分类讨论: 比如说n=5,Ai=5则 (1):4!+4!+4!+4!+4!结果:5 (2):4!+4!+4!+4!+(10^8)!结果:4 (3):(10^6)!+(10^6)!+(10^6)!+(10^6)!+(10^6)! 结果:10^6 所以我们可以控制Ai的最大值为10^5,并分为两类: (1)或(3); (2) 这样就能保证所有的用例皆正确。
代码
#include<stdio.h>
#define N 100000
int main()
{
int i,b[N]={0},n,t=0,max=1,min=N,a=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&t);
if(t<N)
b[t]++;
else
a++;
if(t<min)
min=t;
if(t>max)
max=t;
}
if(a==n)
{
printf("%d",t);
return 0;
}
for(i=min;i<=max; i++)
{
if(b[i]%(i+1))
{
printf("%d",i);
return 0;
}
b[i+1]+=b[i]/(i+1);
}
return 0;
}