HDU 3123 题解,想到怎么做就不难了此题一开始没注意到long long数据的问题,最后没有除m WA了7次。幸亏最后发现了啊!这个AC来得太不容易了

需要用到一些数学公式:(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 }

  

posted @ 2011-08-21 23:19  zhongya  阅读(180)  评论(0编辑  收藏  举报