阶乘取模

2019-04-14 08:37发布

Description

计算 (0! + 1! + 2! + 3! + 4! + ... + n!)%m

Input

第一行输入t,表示测试数据组数 每组数据输入两个数n和m 0 < T <= 20 0 <= n < 10^100 (没有前导零) 0 < m < 1000000

Output

输出(0! + 1! + 2! + 3! + 4! + ... + n!)%m的答案

Sample Input

1 10 861017

Sample Output

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; }