阶乘的和。给定 n 个数 Ai,问能满足 m! 为 ∑i=1n(Ai!)的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 1×2×3×⋯×m。

问题描述

给定 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++1s256M
C1s256M
Java2s256M
Python33s256M
PyPy33s256M
Go3s256M
JavaScript3s256M

解题思路

 题目解读:求能满足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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值