2349. 魔力阶乘

1000ms 256MB 简单 循环 简单数学
题目描述
阶乘的定义:一个正整数的阶乘是所有小于及等于该数的正整数的乘积。 - 例如:3 的阶乘为 $3! = 1 \times 2 \times 3 = 6$。 - 例如:5 的阶乘为 $5! = 1 \times 2 \times 3 \times 4 \times 5 = 120$。 在魔法森林里,松鼠哈利种下了一棵“阶乘魔力果树”。这棵树第一天结出 $1!$ 个坚果,第二天结出 $2!$ 个坚果……第 $i$ 天结出 $i!$ 个坚果。 给定一个正整数 $N$(表示天数),请你计算前 $N$ 天(包含第 1 天和第 $N$ 天)哈利一共可以收获多少个坚果?
输入格式
输入一个正整数 $N$ ($3 \le N \le 20$)。
输出格式
输出 1 到 $N$ 之间(包含 1 和 $N$)所有正整数阶乘的和。
样例 1
输入 (Input)
3
输出 (Output)
9
样例说明
输入为 3。1 的阶乘为 1,2 的阶乘为 2,3 的阶乘为 6。 总和为 $1 + 2 + 6 = 9$,因此输出 9。
- 对于所有数据:$3 \le N \le 20$。 - **整型溢出提示**: 当 $N = 20$ 时,$20!$ 的大小约为 $2.43 \times 10^{18}$。这已经远远超出了 C++ 中标准整型 `int`(最大约为 $2 \times 10^9$)的表示上限。 因此,在程序中保存阶乘结果以及总和的变量,必须定义为 **`long long`** 类型(在 64 位系统中可表示的最大值约为 $9.22 \times 10^{18}$),否则计算出的结果会发生溢出错误。 - **算法提示**: 不需要每次都重新计算每个数的阶乘(这样复杂度为 $O(N^2)$)。可以使用一个变量 `current_fact` 在循环中不断乘以当前的 $i$,从而以 $O(N)$ 的时间复杂度累加得出答案。
自测终端 stdin → stdout
输入 stdin
CtrlShiftEnter
输出 stdout

                
错误 stderr

                
CtrlEnter提交
自动保存已开启
操作成功
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字