我正在尝试做一个你应该找到第n个阶乘的分频器的练习:
https://www.e-olymp.com/en/problems/124
所以这是我的代码:
int fact(int n){
return (n==1 || n==0) ? 1 : n*fact(n-1);
}
long long int a,b=1,c=0;
cin>>a;
long long int y=fact(a);
while(b!=y){
if(y%b==0){
c++;
}
b++;
}
cout<<c+1<<endl;
但是这段代码花费了太多时间,我需要更快的东西。不要给代码,算法就足够了。
答案 0 :(得分:2)
在此任务中1 <= N <= 45
。显然,N
太大而无法直接计算。
您应该实施另一种方法。只需从1
迭代到N
,然后为每个i, 1 < i <= N
执行素数分解。然后,您可以轻松找到N!
的素数因子分解,只需合并每个i, 1 < i <= N
的因式分解。之后使用先前计算的分解来计算除数的总数。
6!的例子:
2 = 2
3 = 3
4 = 2 ^ 2
5 = 5
6 = 3 * 2
所以:
6! = 2 ^ 4 * 3 ^ 2 * 5
除数的数量:
(4 + 1) * (2 + 1) * (1 + 1) = 30
答案 1 :(得分:0)
使用一些数学。
如果您知道数字的素因子,那么计算除数的数量是微不足道的。
很容易找到阶乘的主要因素。不计算阶乘本身。