如标题所示,求一个从1的阶乘到n的阶乘的和。由于和可能会非常的大,因此可以指定对mod进行求余操作
输入格式
第一行由一个整数 T 组成,表示测试用例的数量。 单个测试包含两个整数 n 和 m。(0 !定义为 1, 它是乘法中的中性元素,不与任何东西相乘)
输出格式
输出(0 ! +1 ! +2 ! +3 ! +4 ! + … +n !)%m 的值。
输入输出样例
输入 #1复制
1 10 861017
输出 #1复制
593846
#include <cstdio>
#include <cstring>
typedef long long ll;
ll solve(char num[], ll mod) {
int len = strlen(num);
int tmp = 0;
for (int i = 0; i < len; i++) {
tmp = 10 * tmp + num[i] - '0';
if (tmp >= mod)
break;
}
if (tmp <= 1) {
return (tmp + 1) % mod;
}
int t = 1;
int res = 0;
for (int i = 1; i <= mod && i <= tmp; i++) {
t = (t * i) % mod;
res = (res + t) % mod;
}
return res + 1;
}
int main()
{
int t;
ll mod, res;
char num[110];
scanf("%s%lld", &num, &mod);//输入n和mod
res = solve(num, mod);
printf("%lld\n", res);
return 0;
}