寻找阶乘因子至K倍

时间:2014-08-23 04:30:16

标签: c++ algorithm

给定N和K,我们需要找到

的值
Fact(Fact(Fact(......Fact(N)....))) k times.

其中Fact(N)= 1 * 2 * 3 * ..... *(N-1)* N。

表示如果k = 2,我们必须计算Fact(Fact(N))的值等等。

我们需要找到mod 107的值。

因此,如果N = 3且K = 2,则答案为78:

Fact(Fact(3))=Fact(6)=720.
720 % 107=78. So, answer is 78.

怎么做?请帮忙。

代码:

long long int fact(long long  int n){
    if(n==0)
       return 0;
    if(n==1)
       return 1;
    if(n>=107)
       return 0;
    else
       return mulmod(n,fact(n-1),107);  
}

主要:

int n,k,c=0;
cin>>n>>k;
long long  int ans=fact(n);
c++;
while(c<k){
    ans=fact(ans);
    c++;
}

用于乘法:

long long mulmod( long long  a, long long  b, long long  c){
long long x = 0,y=a%c;
while(b > 0){
    if(b%2 == 1){
        x = (x+y)%c;
    }
    y = (y*2)%c;
    b /= 2;
}
return x%c;
}

3 个答案:

答案 0 :(得分:4)

意识到如果N> = 107,那么N!被107整除。

因此,您只需要担心N和K的几个值。

答案 1 :(得分:0)

首先,这不是你如何做一个递归因子。下面是一个与你保持模数的方法。

long long int fact(long long int n, long long int modBy) {
    if (n <= 1) return 1; // remember, 0 factorial is actually 1
    return (n * fact(n - 1, modBy)) % modBy;
}

但是,由于您正在考虑因子的阶乘,深度为k,因此您可以围绕计算深度的递归包装。

long long int factfact(long long int n, long long int k, long long int modBy) {
    if (k < 1) return n; // no depth left
    return fact(factfact(n, k - 1, modBy), modBy);
}

此外,我对这些long long int变量并没有很好的感觉,当它们都保持积极的时候......我会typedef unsigned long long ULL;来缓解我的疑虑并避免输入。

答案 2 :(得分:0)

这是我的代码在理论上是正确的,但数字太大而无法计算。 N = 3,K = 3的结果以1000到2000位数运行

#include <iostream>

using namespace std;
int len;
long Fact(long f){
    if (len == 1){
        long res = 1;
        for (long i = 1; i <= f; i++){
            res *= i;
        }
        return res;
    }
    if (len > 1){
        len--;
        long res = 1;
        long up = Fact(f);
        for (long i = 1; i <= up; i++){
            res *= i;
        }
        return res;
    }
}
int main(){
    long num;
    cout << "\nEnter N: ";
    cin >> num;
    cout << "\nEnter K: ";
    cin >> len;
    cout << endl << len;
    cout << "\nRecursive Factorial is: " << Fact(num) << endl;
    return 0;
}

我建议使用一些大整数库作为单个结果,N = 3,K = 3大小约为800字节。

720的答案!是2.601218943565795100204903227081e + 1746(由Windows计算器计算)这是1746位数!你不能指望任何正常的数据类型来处理那种数字(不会长久不会有帮助)