1. n ! n! n!的质因子的问题
借助公式 :
a n s = n p + n p 2 + . . . . . + n p m ans = \frac{n}{p}+\frac{n}{p^{2}}+.....+\frac{n}{p^{m}} ans=pn+p2n+.....+pmn
1.阶乘的质因子2的个数
#include<iostream>
using namespace std;
int main(){
int p = 2;
int n;
cin>>n;
int ans = 0;
while(n>0){
ans += n/p;
n/=p;
}
cout<<ans;
return 0;
}
2. n ! n! n! 的末尾0的个数
n ! n! n!的末尾的0的个数就为质因子为5的个数,因为一个2*5 = 10,而2的个数一定大于5,所以为5的个数
#include<iostream>
using namespace std;
int main(){
int p = 0 ;
cin>>p;
int n;
cin>>n;
int ans = 0;
while(n>0){
ans += n/p;
n/=p;
}
cout<<ans;
return 0;
}
3.阶乘中因子m的个数
这里指的是因子m的个数,而不是质因子m的个数,所以需要进行计算
#include<iostream>
#include<vector>
using namespace std;
vector<int> mp;
vector<int>ans;
struct Factor{
int x;
int cnt;
};
Factor fac[10];
int prime[10] = {2,3,5,7,11,13,17,19,23,29};
int main(){
int m;
int n;
cin>>n>>m;
int k=0;
//记录因子m的质因子的个数和大小
for(int i=0;i<10;i++){
int num = prime[i];
if(m%prime[i]==0){
fac[k].x=prime[i];
fac[k].cnt=0;
while(m%prime[i]==0){
fac[k].cnt++;
m/=prime[i];
}
k++;
}
}
if(m!=1){
fac[k].x=m;
fac[k++].cnt=1;
}
//计算n!中关于m的质因子的个数
for(int i=0;i<k;i++){
int p = fac[i].x;
int anst = 0;
int tn=n;
while(tn>0){
anst+=tn/p;
tn/=p;
}
ans.push_back(anst/fac[i].cnt);
}
int min = 1000000;
for(int i=0;i<ans.size();i++){
if(min>ans[i])
min = ans[i];
}
cout<<min;
}