需要用到一些数学公式:(a+b)%m = (a%m + b%m)%m
(a*b)%m = (a%m * b%m)%m这是利用它的余数来优化,从而减少了计算量
 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int main()
 5 {
 6     int i, ncases, num, m;
 7     long long  k, sum;
 8     char n[101];
 9     
10     while(scanf("%d", &ncases) != EOF)
11     {
12        while(ncases--)
13        {
14           scanf("%s%d",n,&m);
15           if(strlen(n) < 7)
16           {
17              num = 0;
18              for(i=0; i<strlen(n); i++)
19              {
20                 n[i] = n[i] - '0';
21                 num = n[i] + num*10;
22              } 
23              sum = 1;
24              k = 1;
25              for(i=1; i<=num; i++)
26              {   
27                 k = (k*i)%m;  
28                 sum = (k + sum)%m;    
29              }              
30           }
31          else
32          {
33             sum = 1;              
34             k = 1;
35             for(i=1; i<m; i++)
36             {
37                k = (k*i)%m;      
38                sum = (k+ sum)%m;     
39             }  
40          }
41         printf("%lld\n",sum%m);  //此处一开始m没有除,导致了WA了7次。
42        }  
43     }
44     return 0;   
45 }