给定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;
}
答案 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位数!你不能指望任何正常的数据类型来处理那种数字(不会长久不会有帮助)