Advertisement
bibaboba12345

пиздец

Nov 8th, 2021
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <cmath>
  6. #include <iomanip>
  7. #include <string>
  8. using namespace std;
  9. int n;
  10. int add[2000], MINANS = 1e3;
  11. const int N = 2e5;
  12. vector<char> answ;
  13. const int NumberOfHashes = 1;
  14. int vis[1000000];
  15. struct Hash {
  16. long long q;
  17. long long p;
  18. long long pows[N];
  19. void CntPows() {
  20. pows[0] = 1;
  21. for (int i = 1; i < N; i++) {
  22. pows[i] = (pows[i - 1] * q) % p;
  23. }
  24. }
  25. };
  26. Hash hashes[NumberOfHashes];
  27. struct Hashed {
  28. string s;
  29. vector<int> prefixhash[NumberOfHashes];
  30. void CountHash() {
  31. for (int h = 0; h < NumberOfHashes; h++) {
  32. prefixhash[h].resize(s.size());
  33. prefixhash[h][0] = s[0];
  34. for (int i = 1; i < s.size(); i++) {
  35. prefixhash[h][i] = (prefixhash[h][i - 1] * hashes[h].q + s[i]) % hashes[h].p;
  36. }
  37. }
  38. }
  39. int GetHash(int l, int r) {
  40. vector<long long> ans;
  41. for (int h = 0; h < NumberOfHashes; h++) {
  42. long long answ = prefixhash[h][r];
  43. if (l > 0) {
  44. answ -= (prefixhash[h][l - 1] * hashes[h].pows[r - l + 1]) % hashes[h].p;
  45. }
  46. if (answ < 0) {
  47. answ += hashes[h].p;
  48. }
  49. return answ;
  50. }
  51.  
  52. }
  53. };
  54. Hashed S1;
  55.  
  56.  
  57. string divide_by_2(string s) {
  58. for (int i = s.size() - 1; i >= 0; i--) {
  59. int val = s[i] - '0';
  60. if (val % 2 == 0) {
  61. val /= 2;
  62. s[i] = val + '0';
  63. }
  64. else {
  65. s[i + 1] += 5;
  66. val /= 2;
  67. s[i] = val + '0';
  68. }
  69. }
  70. reverse(s.begin(), s.end());
  71. while (!s.empty() && s[s.size() - 1] == '0') {
  72. s.pop_back();
  73. }
  74. reverse(s.begin(), s.end());
  75. return s;
  76. }
  77.  
  78. string mult_by_2(string s) {
  79. for (int i = s.size(); i >= 0; i--) {
  80. add[i] = 0;
  81. }
  82. reverse(s.begin(), s.end());
  83. for (int i = 0; i < s.size(); i++) {
  84. int val = s[i] - '0';
  85. val *= 2;
  86. add[i] += val % 10;
  87. add[i + 1] += val / 10;
  88. }
  89. s.resize(s.size() + 1);
  90. for (int i = 0; i < s.size(); i++) {
  91. s[i] = '0' + add[i];
  92. }
  93. while (!s.empty() && s[s.size() - 1] == '0') {
  94. s.pop_back();
  95. }
  96. reverse(s.begin(), s.end());
  97. return s;
  98.  
  99. }
  100.  
  101.  
  102. void get(int num, vector<char> ans, string s,bool mult, bool div) {
  103. if (num >= MINANS) {
  104. return;
  105. }
  106. if (s == "1") {
  107. if (num < MINANS) {
  108. MINANS = num;
  109. answ = ans;
  110. return;
  111. }
  112. }
  113. S1.s = s;
  114. S1.CountHash();
  115. int val = S1.GetHash(0, s.size() - 1);
  116. if (vis[val] == 0 || vis[val] > num) {
  117. vis[val] = num;
  118. }
  119. else {
  120. return;
  121. }
  122. //cout << s << " " << num << '\n';
  123. string s1, s2;
  124. if (s.size() % 2 == 0) {
  125. for (int i = 0; i < s.size() / 2; i++) {
  126. s1.push_back(s[i]);
  127. }
  128. for (int i = s.size() / 2; i < s.size(); i++) {
  129. s2.push_back(s[i]);
  130. }
  131. ans.push_back('3');
  132. get(num + 1, ans, s1, 0,0);
  133. ans.pop_back();
  134. ans.push_back('4');
  135. get(num + 1, ans, s2, 0,0);
  136. ans.pop_back();
  137. ans.push_back('5');
  138. get(num + 1, ans, s1+s1, 0,0);
  139. ans.pop_back();
  140. ans.push_back('6');
  141. get(num + 1, ans, s2+s2, 0,0);
  142. ans.pop_back();
  143. }
  144. if (!(s[s.size() - 1] % 2) && !mult) {
  145. s1 = divide_by_2(s);
  146. ans.push_back('2');
  147. get(num + 1, ans, s1, 0, 1);
  148. ans.pop_back();
  149. }
  150. if (!div) {
  151. s1 = mult_by_2(s);
  152. ans.push_back('1');
  153. get(num + 1, ans, s1, 0, 1);
  154. ans.pop_back();
  155. }
  156.  
  157. }
  158.  
  159.  
  160. string s;
  161. int main() {
  162. ios::sync_with_stdio(false);
  163. cin.tie(0);
  164. hashes[0].q = 137;
  165. hashes[0].p = 937897;
  166. hashes[0].CntPows();
  167. //freopen("input.txt", "r", stdin);
  168. cin >> s;
  169. get(0, answ, s, 0, 0);
  170. if (MINANS == 1e3) {
  171. cout << -1;
  172. return 0;
  173. }
  174. cout << answ.size() << "\n";
  175. for (int i = 0; i < answ.size(); i++) {
  176. cout << answ[i];
  177. }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement