计算
(0! + 1! + 2! + 3! + 4! + ... + n!)%m
第一行输入t,表示测试数据组数
每组数据输入两个数n和m
0 < T <= 20
0 <= n < 10^100 (没有前导零)
0 < m < 1000000
输出(0! + 1! + 2! + 3! + 4! + ... + n!)%m的答案
1
10 861017
593846
这道题注意的是每次运算都要取模,不然会很大,会数据溢出。
参考代码:
#include
#include
#include
using
namespace
std;
int
main()
{
__int64
i,s,t,m,n,temp;
char
c[110];
scanf
(
"%I64d"
,&t);
while
(t--)
{
n=0;
temp=s=1;
scanf
(
"%s"
,c);
scanf
(
"%I64d"
,&m);
if
(
strlen
(c)>7)
n=m;
else
for
(i=0;i<
strlen
(c);i++)
n=10*n+c[i]-
'0'
;
if
(n>m)
n=m;
for
(i=1;i<=n;i++)
{
temp*=i;
temp%=m;
s+=temp;
s%=m;
}
printf
(
"%I64d
"
,s%m);
}
return
0;
}