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 }