首页 > 代码库 > 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 }
HDU 5139
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。