阶乘
题目大意
有 个正整数 ,设它们乘积为 ,你可以给 乘上一个正整数 ,使 刚好为正整数 的阶乘,求 的最小值。
对于 的数据,。
解题思路
根据题目可得,根据整数的唯一分解式,,其中 为质数。
方法一
根据上式, 也可以分解,那么最小的 只需满足包含所有 就行了。
看一个数 中有多少的 的方法。
加到有 为止就行了。
采用二分答案,二分 ,使 满足上面的要求。
时间复杂度为
AC CODE
方法一
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
x = x * 10 + c - 48;
c = getchar();
}
return x * f;
}
int n;
int mmax;
int ans = 0;
int a[100005];
void kkk(int x)
{
int xx = x;
for(int i = 2; i * i <= xx; ++i)
{
if(xx % i == 0)
{
while(x % i == 0)
{
x /= i;
a[i]++;
}
}
}
if(x) a[x]++;
}
int wjy(int x, int y)
{
int j = y;
int res = 0;
while(x >= j)
{
res += x / j;
j = j * y;
}
return res;
}
bool check(int mid)
{
for(int i = 2; i <= mmax; ++i)
if(wjy(mid, i) < a[i]) return false;
return true;
}
signed main()
{
n = read();
for(int i = 1; i <= n; ++i)
{
int x;
x = read();
kkk(x);
mmax = max(mmax, x);
}
int l = 1, r = 1e9;
while(l <= r)
{
int mid = (l + r) >> 1;
if(check(mid))
{
ans = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
printf("%lld\n", ans);
return 0;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122121