首页 > 代码库 > HDU 5139

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

 

HDU 5139