题意:
给N、K,问满足 n!%(k^x)=0 最大的x。
思路:
首先当k=1的时候,输出inf
然后就是,因为要整除,所以我们就分解k的质因子
假设每个质因子有si个,那么对应的n!里面有sumi个
那么对于当前因子最大的x=suni/si
然后就是所有的因子找最小值了。
这里需要打表 10^7的素数表
代码:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
#define ll __int64
#define N 10000000
using namespace std;
int v[10000007],ss[777777],scnt;
void ssb()
{
scnt=0;
memset(v,0,sizeof(v));
int lit=sqrt(N*1.0);
for(int i=2; i<=lit; i++)
{
if(!v[i])
{
for(int j=2; j*i<=N; j++) v[j*i]=1;
}
}
for(int i=2; i<=N; i++) if(!v[i]) ss[scnt++]=i;
}
ll solve(ll n,ll m)
{
ll ans=0;
while(n)
{
n/=m;
ans+=n;
}
return ans;
}
int main()
{
int t,cas=1;
cin>>t;
ssb();
while(t--)
{
ll k,n;
ll ans=-1;
scanf("%I64d%I64d",&n,&k);
printf("Case %d: ",cas++);
if(k==1)
{
puts("inf");
continue;
}
for(int i=0; i<scnt; i++)
{
if(ss[i]>k) break;
ll tep=0;
while(k%ss[i]==0)
{
tep++;
k/=ss[i];
}
if(tep!=0)
{
ll sum=solve(n,ss[i]);
if(ans==-1) ans=sum/tep;
else ans=min(ans,sum/tep);
}
}
if(k>1)
{
if(ans==-1) ans=solve(n,k);
else ans=min(ans,solve(n,k));
}
printf("%I64d\n",ans);
}
return 0;
}