唯一分解定理
唯一分解定理:
一个大于0的整数N,要么其本身是质数,要么就可以分解为若干个质数的乘积(可能是一次的,可能不是一次的)
比如我们求360的正约数,根据唯一分解定理可以知道,
360 = 2的三次方×3的二次方×5
360的正约数的个数,相互独立根据乘法原理有4×3×2=24种
(2的取法有0次,1次,2次,三次,即可以取1,2,4,8)
对于N的阶乘而言,只要求出每个数的正约数,然后将他们相同的质数的次数相加,即可求出n!的所有正约数,将(每个正约数次数+1)相乘
即可
程序
用一个数组记录对应正约数的个数:
int cnt[100]={0};
- 求一个数的质数
void gerPrime(int a, int (&s)[100])
{
for(int i=2;i*i<=a;++i)
{
if(a%i==0)//表示这个i是可以整除a的
while(a%i==0)
{
a/=i;
s[i]++;
}
}
if(a>1) s[a]++;
}
全部代码:
//阶乘的正约数
#include<bits/stdc++.h>
using namespace std;
int cnt[100]={0};
//唯一分解定理
void gerPrime(int a, int (&s)[100])
{
for(int i=2;i*i<=a;++i)
{
if(a%i==0)//表示这个i是可以整除a的
while(a%i==0)
{
a/=i;
s[i]++;
}
}
if(a>1) s[a]++;
}
signed main()
{
long long ans=1;//存储结果
//遍历每个数,求对应的分解质数
for(int i=0;i<=100;++i)
{
gerPrime(i, cnt);
}
//求正约数个数
for(int i=0;i<=100;++i)
{
if(cnt[i]!=0) ans*=(cnt[i]+1);
}
std::cout<<ans;
return 0;
}