文章目录
- 阶乘的末尾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;
}