时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子。
输入描述:
两个数n, p (1e18>= n>= 10000 >= p >= 2)
输出描述:
一个数 表示k
示例1
输入
10000 12
输出
4996
没有考虑特殊情况,来来回回折腾了好久....在这里有个fun(n,k)计算n!中k因子的个数..
ps: 一定要注意边界情况
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll a[10000],b[10000],c[10000];
ll fun(ll n,ll k)
{
ll sum=0;
while(n)
{
sum+=n/k;
n/=k;
}
return sum;
}
bool ch(int pos,ll k)
{
for(int i=0;i<pos;i++)
if(b[i]*k>c[i]) return false;
return true;
}
int main()
{
ll n,p;
while(cin>>n>>p)
{
int pos=0;
memset(b,0,sizeof(b));
for(ll i=2;i*i<=p;i++)
{
if(p%i==0)
{
a[pos]=i;
ll cnt=0;
while(p%i==0)
p/=i,cnt++;
b[pos]=cnt;
pos++;
}
}
if(p>1)
{
a[pos]=p,b[pos]=1;
pos++;
}
ll ans=1e18;
for(int i=0; i<pos; i++)
{
c[i]=fun(n,a[i]);
ll k=c[i]/b[i];
if(!k) ans=0;
ans=min(ans,k);
}
cout<<ans<<endl;
}
}