题意:
就是给你一个数p,问你最小的正整数n!是p的倍数。
思考:
刚开始我以为是二分,然后阶乘的同时%p,看看最后是否为0,但是一看数据范围肯定超时。那只能是分解质因数了,分解完之后,发现答案就是最大的因子*它出现的次数需要到达的数,这个需要到达的数,就直接枚举呗,当是1倍2倍…直到这个因子出现的次数大于等于这个因子mp.se即可。当然也可以二分,二分到mid,对于p出现的每个因子,看看1到mid中会出现这个因子多少次,如果全部满足就可以。
代码:
int T,n,m,k;
int va[N];
map<int,int > mp;
signed main()
{
IOS;
cin>>T;
while(T--)
{
cin>>n;
mp.clear();
for(int i=2;i<=n/i;i++)
{
while(n%i==0) mp[i]++,n /= i;
}
if(n>1) mp[n]++;
int maxn = 1;
for(auto t:mp)
{
int sum = 0;
for(int i=1;;i++)
{
int now = i*t.fi;
while(now%t.fi==0) sum++,now /= t.fi;
if(sum>=t.se)
{
maxn = max(maxn,t.fi*i);
break;
}
}
}
cout<<maxn<<"\n";
}
return 0;
}
总结:
反正这种题目无非就是这几种做法。