求100!的约数个数
方案数:39001250856960000
先上结论:n! = 2p13p2 5p3 …,n!的约数个数为(p1+1)* (p2+1) * (p3+1) …(pm+1)
证明:任意一个数都可以分解成若干个质数的乘积, 例如 6 = 2 * 3 ,34 = 2 * 17 显然n!也可以用这种方法来表示,那么方案个数为啥可以用连乘表示呢,因为对于p1个2,有p1+1种选法,你可以选0个,也可以选p1个,同理,对于3,你可以选0个,也可以选p2个,那么对于m个约数,方案数就等于pi+1连乘。特别的,当所有质数的次数都取0的时候,约数就是1,都取pi得时候,约数就是他本身。
代码
**
#include <iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
int isPrime(int n)
{
if(n <= 1)
return 0;
for(int i = 2; i * i <= n; i++)
{
if(n % i == 0)
return 0;
}
return 1;
}
int a[202];
int cnt = 1;
map<int, int>mp;
void init()
{
for(int i = 1; i <= 100; i++)
{
if(isPrime(i))
{
mp[cnt++] = i;//存放第i个质数
}
}
}
int main()
{
init();
int n = 100;
for(int i = 1; i <= n; i++)
{
int k = i;
while(k != 1)
{
for(int j = 1; j <= 25; j++)//100以内有25个质数
{
int division = mp[j];
if(k % division == 0)
{
a[division]++;
k /= division;
break;
}
}
}
}
ll sum = 1ll;//注意答案爆int
for(int i = 1; i <= n; i++)
{
sum *= (a[i] + 1);
}
printf("%lld", sum);
return 0;
}