【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目。求P(n)。
P(n) = n*(1+1/2+1/3+1/4+...+1/n)。
结果如果可以除尽则表示为整数,否则表示为假分数。

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 #define MAXN 25
 5 
 6 __int64 buf[MAXN];
 7 
 8 __int64 gcd(__int64 a, __int64 b) {
 9     if (b == 0) return a;
10     else    return gcd(b, a%b);
11 }
12 
13 int main() {
14     int i, j, k, n;
15     __int64 fz, fm, tmp, intr;
16 
17     buf[1] = 1;
18     for (i=2; i<=22; ++i)
19         buf[i] = i*buf[i-1]/gcd(i, buf[i-1]);
20 
21     while (scanf("%d", &n) != EOF) {
22         fz = 0;
23         fm = buf[n];
24         for (i=1; i<=n; ++i)
25             fz += fm/i;
26         fz *= n;
27         tmp = gcd(fz, fm);
28         fz /= tmp;
29         fm /= tmp;
30         tmp = fz/fm;
31         fz -= tmp*fm;
32         if (fz == 0) {
33             printf("%I64d\n", tmp);
34             continue;
35         }
36         n = 0;
37         intr = tmp;
38         while (tmp) {
39             ++n;
40             tmp /= 10;
41         }
42         for (i=0; i<=n; ++i)
43             printf(" ");
44         printf("%I64d\n", fz);
45         printf("%I64d ", intr);
46         j = k = 0;
47         while (fz) {
48             ++j;
49             fz /= 10;
50         }
51         tmp = fm;
52         while (tmp) {
53             ++k;
54             tmp /= 10;
55         }
56         j = (j>k) ? j:k;
57         for (i=0; i<j; ++i)
58             printf("-");
59         printf("\n");
60         for (i=0; i<=n; ++i)
61             printf(" ");
62         printf("%I64d\n", fm);
63     }
64 
65     return 0;
66 }

 

posted on 2014-06-17 22:01  Bombe  阅读(277)  评论(0编辑  收藏  举报

导航