求 (1! + 2! + 3! + ...... n!) % 998244353. n <= 1000000. (%是取模的意思)
时间: 2023-11-17 09:59:12 浏览: 160
题目要求我们求1!+2!+3!+...+n!对998244353取模的结果,其中n<=1000000。我们可以使用循环来计算这个和,但是由于n的范围比较大,直接计算阶乘会导致溢出,因此我们需要使用一些技巧来避免这个问题。
我们可以使用一个变量p来保存当前的阶乘值,每次计算完当前的阶乘后,将其加入到总和中,并将p乘以i+1,这样就可以避免溢出的问题。最后将总和对998244353取模即可得到答案。
下面是代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#define MOD 998244353
int main() {
int n;
long long p = 1, sum = 0;
printf("please enter n ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
p = (p * i) % MOD;
sum = (sum + p) % MOD;
}
printf("1! + 2! + 3! +_....+%d! = %lld\n", n, sum);
return 0;
}
```
相关问题
求+(1!+++2!+++3!+++......+n!)+%+998244353. n+<=+1000000. (%是取模的意思) 输入
这是一道关于计算阶乘和的问题,需要求出1!+2!+3!+...+n!的结果并对998244353取模。其中n的范围是小于等于1000000。下面是一个可能的解法:
1. 首先定义一个变量sum来保存阶乘和的结果,初始值为0。
2. 然后使用一个循环从1到n,每次计算当前数的阶乘并加到sum中。
3. 在计算阶乘时,可以使用一个变量factorial来保存当前数的阶乘,初始值为1。然后在循环中每次将factorial乘以当前数,即可得到当前数的阶乘。
4. 最后将sum对998244353取模,即可得到最终结果。
代码如下:
```
sum = 0
factorial = 1
for i in range(1, n+1):
factorial = factorial * i % 998244353
sum = (sum + factorial) % 998244353
print(sum)
```
题目描述 求 (1! + 2! + 3! + ...... n!) % 998244353. n <= 1000000.
这道题目要求我们计算从1到n的阶乘之和,并对998244353取模。我们可以使用循环来计算每个数的阶乘,并将它们相加。由于n的范围很大,我们需要使用long long类型来存储阶乘和结果。同时,我们需要使用快速幂算法来对结果取模,以避免溢出。
以下是代码实现:
```
#include <iostream>
using namespace std;
const int MOD = 998244353;
long long pow_mod(long long a, long long b) {
long long res = 1;
while (b) {
if (b & 1) res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res;
}
int main() {
int n;
cin >> n;
long long ans = 0, fac = 1;
for (int i = 1; i <= n; i++) {
fac = fac * i % MOD;
ans = (ans + fac) % MOD;
}
ans = ans * pow_mod(2, MOD - 2) % MOD;
cout << ans << endl;
return 0;
}
```
阅读全文