文章目录
- 阶乘的末尾0
- 整除问题
一、阶乘的末尾0IO链接
本题思路:由于本题需要求阶乘的末尾0,由于我们知道2*5=10可以得到一个0,那么我们就可以找出2的数和5的数,但是由于是阶乘,所以5的数量肯定是小于2的数量,因此我们只需要知道5的数量即可,这里只需要算含有5的次幂的数目即可。
#include <bits/stdc++.h>
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);std::cout.tie(nullptr);
int n;
std::cin>>n;
//这里我们可以知道2和5的乘积能得到0,那么我们可以知道某个数的阶乘中2这个质因子的次数肯定大于5这个质因子出现的次数
int cnt=0;
while(n){
cnt+=n/5;
n/=5;
}
std::cout<<cnt<<std::endl;
return 0;
}
二、整除问题IO链接
本题思路:我们可以把 a 给拆分成若干个质因子之积,然后看下 2 ~ n 中包含多少个对应的质因子,就能得出来最多可以整除 a 的多少次方。比如 a 中有质因子p1、p2、p3,2 ~ n 中有对应的质因子、num1、num2 … 个,那 k 的最大值也就是若干个 num 的最小值。
#include <bits/stdc++.h>
int n,a;
std::vector<std::vector<int>> ans;
void divide(int n)
{
for(int i=2;i<=n/i;i++){
if(n%i==0){
int s=0;
while(n%i==0){
s++;
n/=i;
}
ans.push_back({i,s});
}
}
if(n>1) ans.push_back({n,1});
}
int get_p(int n,int p)
{
int cnt=0;
while(n){
cnt+=n/p;
n/=p;
}
return cnt;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);std::cout.tie(nullptr);
std::cin>>n>>a;
divide(a);
int res=INT_MAX;
for(int i=0;i<ans.size();i++)
res=std::min(res,get_p(n,ans[i][0])/ans[i][1]);
std::cout<<res<<std::endl;
return 0;
}