解析:
分解N!质因数 和p的质因数为什么呢 ??
例如
N!=120 P=60
那么N!=120=23 * 3 *5
P=22 * 3 *5
想要N!是p的倍数,那么N!必须存在一个和p分解的质因数要一样,且幂次一定要大于p分解质因数的幂次 才可以。
那么我们就二分n
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+1000;
int prime[N];
int num[N],cnt;
int l,r,p;
int t;
void init(int p)
{
cnt=0;
for(int i=2;i*i<=p;i++)
{
if(p%i==0)
{
prime[++cnt]=i;
while(p%i==0)
{
num[cnt]++;
p/=i;
}
}
}
if(p>1)
{
prime[++cnt]=p;
num[cnt]++;
}
// cout<<"*******"<<endl;
}
bool check(ll tmp)
{
for(int i=1;i<=cnt;i++)
{
ll sum=0;
ll x=tmp;
while(x)
{
sum+=x/prime[i];
x/=prime[i];
}
if(sum<num[i]) return true;
}
return false;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&p);
int l=1,r=1e9;
memset(prime,0,sizeof prime);
memset(num,0,sizeof num);
init(p);
// cout<<"****"<<endl;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid-1;
}
printf("%d\n",l);
}
}