给出两个数字n,m,要求在1s内回答出(n ! ! !) \% m(n!!!)%m的值(即n的阶乘的阶乘的阶乘对m取模后的值)
时间: 2023-08-28 10:06:48 浏览: 188
计算1!……+N!的阶乘和
对于这个问题,我们首先需要了解一下阶乘的阶乘的阶乘的概念。
设f(n)表示n的阶乘的阶乘的阶乘,则有:
f(n) = ((n!)!)!
即f(n)等于n的阶乘的阶乘的阶乘。因此,我们可以先计算n的阶乘,然后计算(n!)!,最后再计算一次阶乘,即可得到f(n)的值。
对于本题,由于n的范围很大,因此我们需要使用大数运算。可以使用C++的boost库中的multiprecision模块来进行大数运算。具体实现代码如下:
```c++
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using boost::multiprecision::cpp_int;
cpp_int fact(cpp_int n, cpp_int m) { // 计算n的阶乘对m取模的值
cpp_int res = 1;
for (cpp_int i = 1; i <= n; i++) {
res *= i;
res %= m;
}
return res;
}
cpp_int f(cpp_int n, cpp_int m) { // 计算n的阶乘的阶乘的阶乘对m取模的值
cpp_int a = fact(n, m);
cpp_int b = fact(a, m);
return fact(b, m);
}
int main() {
cpp_int n, m;
cin >> n >> m;
cout << f(n, m) << endl;
return 0;
}
```
其中,fact函数用于计算n的阶乘对m取模的值,f函数用于计算n的阶乘的阶乘的阶乘对m取模的值。由于阶乘的值可能非常大,因此我们需要使用cpp_int类型来存储结果,这是boost库中提供的一种高精度整数类型。在计算过程中,每次乘法运算都需要对m取模,以避免结果过大导致溢出。最后,直接输出f(n, m)即可。
阅读全文