EOJ2014 Sum of digits

链接:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2014

题目的大意是指有多少个k位数组满足和的各位数之和等于各位数之和的和
本质上就是在求有多少个k位数组满足求和时不进位,首位不可以有0,所以第一位有36种可能,之后后都有55种可能,所以k位数共36*55^(k-1)组,这个用乘法定理就可以证明,而且这题的数据很大,所以只能用高精度的算法实现

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 using namespace std;
 8  
 9 string h[60];
10  
11 string add(string p, string q)
12 {
13     char s[100] = {0};
14     string c;
15     char a[100], b[100];
16     strcpy(a, p.c_str());
17     strcpy(b, q.c_str());
18     int k = 0, l, m, n, x;
19     int i = p.size();
20     int j = q.size();
21     m = i - 1;
22     n = j - 1;
23     while (k < i && k < j)
24     {
25         s[k] = a[m] - '0' + b[n] + s[k];
26         m--;
27         n--;
28         if (s[k] > '9')
29         {
30             s[k] = s[k] - 10;
31             s[k + 1]++;
32         }
33         k++;
34     }
35     if (k == i)
36         for (k = i; k < j; k++)
37         {
38             s[k] = s[k] + b[n];
39             n--;
40             if (s[k] > '9')
41             {
42                 s[k] = s[k] - 10;
43                 s[k + 1]++;
44             }
45         }
46     else
47         for (k = j; k < i; k++)
48         {
49             s[k] = s[k] + a[m];
50             m--;
51             if (s[k] > '9')
52             {
53                 s[k] = s[k] - 10;
54                 s[k + 1]++;
55             }
56         }
57     if (s[k])
58         c += s[k] + '0';
59     for (i = k - 1; i >= 0; i--)
60         c += s[i];
61     return c;
62 }
63  
64 string tim(string a, string b)
65 {
66     int i = 0;
67     string s;
68     while (i < b.size())
69     {
70         s += '0';
71         for (int j = 0; j < (b[i] - '0'); j++)
72             s = add(s, a);
73         i++;
74     }
75     return s;
76 }
77  
78 int main()
79 {
80     h[1] = "36";
81     for (int i = 2; i < 52; i++)
82         h[i] = tim(h[i - 1], "55");
83     int n;
84     while (cin >> n)
85     {
86         cout << h[n] << endl;
87     }
88     return 0;
89 }
View Code
原文地址:https://www.cnblogs.com/KimKyeYu/p/3128692.html