[蓝桥杯]阶乘求值【省模拟赛】
问题描述
给定 nn,求 n!n! 除以 10000000071000000007 的余数。
其中 n!n! 表示 nn 的阶乘,值为从 11 连乘到 nn 的积,即 n!=1×2×3×…×nn!=1×2×3×…×n。
输入格式
输入一行包含一个整数 nn。
输出格式
输出一行,包含一个整数,表示答案。
样例输入
3
样例输出
6
样例输入
7
样例输出
992
评测用例规模与约定
对于 30% 的评测用例,1≤n≤121≤n≤12。
对于 60% 的评测用例,1≤n≤10001≤n≤1000。
对于所有评测用例,1≤n≤10000001≤n≤1000000。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 2s | 256M |
Python3 | 3s | 256M |
PyPy3 | 3s | 256M |
Go | 3s | 256M |
JavaScript | 3s | 256M |
总通过次数: 1801 | 总提交次数: 2084 | 通过率: 86.4%
代码部分:
#include <iostream>
using namespace std;const long long MOD = 1000000007;int main() {int n;cin >> n; // 输入整数nlong long result = 1; // 初始化结果为1(0! = 1)// 循环计算阶乘,每一步取模for (int i = 1; i <= n; i++) {result = (result * i) % MOD;}cout << result << endl; // 输出结果return 0;
}
代码说明:
-
输入处理:程序读取一个整数
n
。 -
初始化结果:
result
初始化为1,因为0的阶乘是1(虽然题目保证n≥1,但初始化仍考虑通用性)。 -
循环计算:
-
使用
for
循环从1乘到n。 -
每一步乘法后立即对
1000000007
取模,防止结果溢出。
-
-
输出结果:最终计算出的
result
即为n! mod 1000000007。
注意事项:
-
时间复杂度:O(n),对于n=1000000,在现代计算机上可在1秒内完成。
-
空间复杂度:O(1),仅使用常数额外空间。
-
数据类型:使用
long long
存储结果,确保中间乘法结果(最大约1e15)不会溢出。 -
模数选择:严格按题目要求使用模数
1000000007
。