HDU 5139

题意:已知求f(n)。

题解:可以转为f(n) = 1!*2!*3!... *n!。

这题数很大,要小心内存和时间。我们可以只存f(0)f(10)f(20)... f(10000000),这样可以解决时间问题,内存我们可以将存的这些数都除以10,然后这题就OK了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #include <time.h>
 6 typedef long long ll;
 7 
 8 const int NO = 1000000;
 9 const int mod = 1000000007;
10 ll f[NO+5], a[NO+5];
11 int n;
12 
13 void parpre()
14 {
15     a[0] = 1;
16     for( int i = 1; i <= NO; ++i )
17     {
18         a[i] = a[i-1];
19         for( int j = 1; j <= 10; ++j )
20             a[i] = a[i] * ( (ll)j+(i-1)*10 ) % mod;
21     }
22 }
23 
24 void init()
25 {
26     f[0] = 1;
27     for( int i = 1; i <= NO; ++i )
28     {
29         f[i] = f[i-1];
30         ll ans = a[i-1];
31         for( int j = 1; j <= 10; ++j ) {
32             ans = ans * ( (ll)j+( i-1 )*10 ) % mod;
33             f[i] = f[i] * ans % mod;
34         }
35     }
36 }
37 
38 int main()
39 {
40     parpre();
41     init();
42     while( ~scanf( "%d", &n ) )
43     {
44         int x = n / 10;
45         int t = n - x*10;
46         ll ans = f[x];
47         ll k = a[x];
48         for( int i = 1; i <= t; ++i ) {
49             k = k * ( (ll)i+x*10 ) % mod;
50             ans = ans * k % mod;
51         }
52         printf( "%I64d\n", ans );
53     }
54     return 0;
55 }
View Code

 

posted @ 2014-12-09 12:50  A_dan  阅读(132)  评论(0编辑  收藏  举报