EOJ-2014 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 }