【HDU】 2674 N!Again

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2674

乍看题目,目测暴力解决,一看数据大小,10^9,目测TLE…… 

接下来稍加分析就能得到结论,显然N>=2009之后结果肯定是0嘛! 然后就想到用打表的方法做,得到2009之前的数据,存放在一个数组中,这个方法也是能过的。

另一个方法是网上看来的,其实只要N>=41之后,结果就是0了,因为41*(40!)= 246105,而5*2009 = 246105,那么其实只需要打表打到41就好了,因为41很小,不打表也是不会超时的。

最后将100之前的N!%2009取模都取出来,就是下面的结果:

1 : 1 ; 2 : 2 ; 3 : 6 ; 4 : 24 ; 5 : 120 ;
6 : 720 ; 7 : 1022 ; 8 : 140 ; 9 : 1260 ; 10 : 546 ;
11 : 1988 ; 12 : 1757 ; 13 : 742 ; 14 : 343 ; 15 : 1127 ;
16 : 1960 ; 17 : 1176 ; 18 : 1078 ; 19 : 392 ; 20 : 1813 ;
21 : 1911 ; 22 : 1862 ; 23 : 637 ; 24 : 1225 ; 25 : 490 ;
26 : 686 ; 27 : 441 ; 28 : 294 ; 29 : 490 ; 30 : 637 ;
31 : 1666 ; 32 : 1078 ; 33 : 1421 ; 34 : 98 ; 35 : 1421 ;
36 : 931 ; 37 : 294 ; 38 : 1127 ; 39 : 1764 ; 40 : 245 ;
41 : 0 ; 42 : 0 ; 43 : 0 ; 44 : 0 ; 45 : 0 ;
46 : 0 ; 47 : 0 ; 48 : 0 ; 49 : 0 ; 50 : 0 ;
51 : 0 ; 52 : 0 ; 53 : 0 ; 54 : 0 ; 55 : 0 ;
56 : 0 ; 57 : 0 ; 58 : 0 ; 59 : 0 ; 60 : 0 ;
61 : 0 ; 62 : 0 ; 63 : 0 ; 64 : 0 ; 65 : 0 ;
66 : 0 ; 67 : 0 ; 68 : 0 ; 69 : 0 ; 70 : 0 ;
71 : 0 ; 72 : 0 ; 73 : 0 ; 74 : 0 ; 75 : 0 ;
76 : 0 ; 77 : 0 ; 78 : 0 ; 79 : 0 ; 80 : 0 ;
81 : 0 ; 82 : 0 ; 83 : 0 ; 84 : 0 ; 85 : 0 ;
86 : 0 ; 87 : 0 ; 88 : 0 ; 89 : 0 ; 90 : 0 ;
91 : 0 ; 92 : 0 ; 93 : 0 ; 94 : 0 ; 95 : 0 ;
96 : 0 ; 97 : 0 ; 98 : 0 ; 99 : 0 ; 100: 0 ;
9ms  (这是整个程序跑下来的时间)

数学菜鸟再次膜拜各路数学好的大神啊~~

 

Main Code
 1 int main()
 2 {
 3     long long n, i, ans;     
 4     while(~scanf("%I64d",&n)){
 5            ans = 1;
 6            if(n>=41){
 7                  printf("0\n");
 8                  continue;
 9            }
10            else{
11                 for(i=2; i<=n; ++i)
12                       ans = ans*i%2009;
13                 printf("%d\n",ans);
14            }
15     }
16     return 0;
17 }
posted on 2012-08-04 10:17  Yuna_  阅读(160)  评论(0)    收藏  举报