nyoj 28 大数阶乘

  题目链接:nyoj 28

  就是个简单的高精度,只是一开始我打表超内存了,然后用了各种技巧硬是把内存缩到了题目要求以下(5w+kb),感觉挺爽的,代码如下:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 const int M = 5002;
 8 const int mod = 1e6;
 9 
10 int b[M + 3][2800], len[M + 3];
11 
12 inline void init(int n = M) {
13     b[1][0] = 1;    len[1] = 1;
14     for(int i = 2; i <= n; ++i) {
15         int x = len[i - 1];
16         int carry = 0;
17         LL tmp;
18         for(int j = 0; j < x; ++j) {
19             tmp = carry + (LL)b[i - 1][j] * i;
20             b[i][j] = tmp % mod;
21             carry = tmp / mod;
22         }
23         while(carry) {
24             b[i][x++] = carry % mod;
25             carry /= mod;
26         }
27         len[i] = x;
28     }
29 }
30 
31 inline void print(const int &x) {
32     putchar(x / 100000 % 10 + '0');
33     putchar(x / 10000 % 10 + '0');
34     putchar(x / 1000 % 10 + '0');
35     putchar(x / 100 % 10 + '0');
36     putchar(x / 10 % 10 + '0');
37     putchar(x % 10 + '0');
38 }
39 
40 inline void output(const int &n) {
41     int i = len[n] - 1;
42     const int &x = b[n][i];
43     printf("%d",x);
44 
45     for(--i; i >= 0; --i)
46         print(b[n][i]);
47     puts("");
48 }
49 
50 int main() {
51     int m;
52     init();
53     while(~scanf("%d",&m))
54         output(m);
55     return 0;
56 }

  出题人原意应该不是让我们打表,而是每读入一个数重新计算一个数……吧:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<cctype>
 5 const int M = 5002;
 6 
 7 int b[2][18000];
 8 
 9 inline void solve(const int &n) {
10     b[1][0] = 1;
11     int len = 1;
12     for(int i = 2; i <= n; ++i) {
13         int carry = 0, tmp;
14         for(int j = 0; j < len; ++j) {
15             tmp = carry + b[!(i & 1)][j] * i;
16             b[i & 1][j] = tmp % 10;
17             carry = tmp / 10;
18         }
19         while(carry) {
20             b[i & 1][len++] = carry % 10;
21             carry /= 10;
22         }
23     }
24     for(int j = len - 1; j >= 0; --j)
25         putchar(b[n & 1][j] + '0');
26     puts("");
27 }
28 
29 template <typename T>
30 inline bool read(T &x) {
31     x = 0;
32     char ch = getchar();
33     while(!isdigit(ch) && ch != EOF)    ch = getchar();
34     if(ch == EOF)   return 0;
35     while(isdigit(ch)) {
36         x = x * 10 + (ch - '0');
37         ch = getchar();
38     }
39     return 1;
40 }
41 
42 int main() {
43     int m;
44     while(read(m))
45         solve(m);
46     return 0;
47 }
posted @ 2015-08-15 16:49  Newdawn_ALM  阅读(155)  评论(0编辑  收藏  举报