题目描述
令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子。
输入描述:
两个数n, p (1e18>= n>= 10000 >= p >= 2)
输出描述:
一个数 表示k
示例1
输入
10000 12
输出
4996
题解:要满足题意则,先将n!和p分解质因子,在两数共有质因子的前提下,n!的质因子的指数除以p质因子的最小值就是所求k
原因请见
https://www.cnblogs.com/6262369sss/p/9723270.html
#include<stdio.h>
#include<math.h>
#define min(a,b) a<b?a:b
long long fun(long long n,long long a)//求n!里素数a的个数
{
long long num=0;
while(n/=a)
{
num+=n;
}
return num;
}
int main()
{
long long n,p;
long long ans=1e18+9;
while(scanf("%lld%lld",&n,&p)!=EOF)
{
for(int i=2;i<=p;i++)
{
if(p%i==0)
{
long long num1=0;
while(p%i==0)
{
p/=i;
num1++;
}
long long num2=fun(n,i);
ans=min(ans,num2/num1);
}
}
printf("%lld\n",ans);
}
}