题意:令 X = n!,给定一大于1的正整数p,求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子,n,,p(1e18>=n>=1e4>=p>=2)
题解:我们要找得也就是k满足 x%(p^k)==0 同时 x%(p^k*p)!=0 显然这样的k 就是x范围内最大的那个p的幂次 因为再乘个p肯定就超过x了
我们也许会首先想到,直接看x里有多少p的倍数就行了,但是很显然,对于样例p=12,有单独的因子3和4结合,因子2和6结合,也可以满足
所以我们显然对p进行处理 处理成p=2^x * 3^y * 5^z……
例如样例p=12 n=10000 p=2^2 * 3
我们先统计n!里有多少个2
t=n/2+n/4+n/8+n/16……
而每个p需要2个2 所以 需要 t/2 个2^2
统计n!有多少个3
同理 o=n/3+n/9+n/27+n/81 需要o/1 个 3^1
t,o中最小的就是答案,p的最小幂次
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long n,p,k,sum,t,nn; 4 int main() 5 { 6 cin>>n>>p; 7 k=1e18; 8 for (int i=2;i<=p;i++) 9 if (p%i==0) 10 { 11 nn=n;sum=0; 12 while (nn) 13 { 14 nn/=i; 15 sum+=nn; 16 } 17 t=0; 18 while (p%i==0) 19 { 20 p/=i; 21 t++; 22 } 23 k=min(k,sum/t); 24 } 25 printf("%lld",k); 26 }