Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <cmath>
- #include <iomanip>
- #include <string>
- using namespace std;
- int n;
- int add[2000], MINANS = 1e3;
- const int N = 2e5;
- vector<char> answ;
- const int NumberOfHashes = 1;
- int vis[1000000];
- struct Hash {
- long long q;
- long long p;
- long long pows[N];
- void CntPows() {
- pows[0] = 1;
- for (int i = 1; i < N; i++) {
- pows[i] = (pows[i - 1] * q) % p;
- }
- }
- };
- Hash hashes[NumberOfHashes];
- struct Hashed {
- string s;
- vector<int> prefixhash[NumberOfHashes];
- void CountHash() {
- for (int h = 0; h < NumberOfHashes; h++) {
- prefixhash[h].resize(s.size());
- prefixhash[h][0] = s[0];
- for (int i = 1; i < s.size(); i++) {
- prefixhash[h][i] = (prefixhash[h][i - 1] * hashes[h].q + s[i]) % hashes[h].p;
- }
- }
- }
- int GetHash(int l, int r) {
- vector<long long> ans;
- for (int h = 0; h < NumberOfHashes; h++) {
- long long answ = prefixhash[h][r];
- if (l > 0) {
- answ -= (prefixhash[h][l - 1] * hashes[h].pows[r - l + 1]) % hashes[h].p;
- }
- if (answ < 0) {
- answ += hashes[h].p;
- }
- return answ;
- }
- }
- };
- Hashed S1;
- string divide_by_2(string s) {
- for (int i = s.size() - 1; i >= 0; i--) {
- int val = s[i] - '0';
- if (val % 2 == 0) {
- val /= 2;
- s[i] = val + '0';
- }
- else {
- s[i + 1] += 5;
- val /= 2;
- s[i] = val + '0';
- }
- }
- reverse(s.begin(), s.end());
- while (!s.empty() && s[s.size() - 1] == '0') {
- s.pop_back();
- }
- reverse(s.begin(), s.end());
- return s;
- }
- string mult_by_2(string s) {
- for (int i = s.size(); i >= 0; i--) {
- add[i] = 0;
- }
- reverse(s.begin(), s.end());
- for (int i = 0; i < s.size(); i++) {
- int val = s[i] - '0';
- val *= 2;
- add[i] += val % 10;
- add[i + 1] += val / 10;
- }
- s.resize(s.size() + 1);
- for (int i = 0; i < s.size(); i++) {
- s[i] = '0' + add[i];
- }
- while (!s.empty() && s[s.size() - 1] == '0') {
- s.pop_back();
- }
- reverse(s.begin(), s.end());
- return s;
- }
- void get(int num, vector<char> ans, string s,bool mult, bool div) {
- if (num >= MINANS) {
- return;
- }
- if (s == "1") {
- if (num < MINANS) {
- MINANS = num;
- answ = ans;
- return;
- }
- }
- S1.s = s;
- S1.CountHash();
- int val = S1.GetHash(0, s.size() - 1);
- if (vis[val] == 0 || vis[val] > num) {
- vis[val] = num;
- }
- else {
- return;
- }
- //cout << s << " " << num << '\n';
- string s1, s2;
- if (s.size() % 2 == 0) {
- for (int i = 0; i < s.size() / 2; i++) {
- s1.push_back(s[i]);
- }
- for (int i = s.size() / 2; i < s.size(); i++) {
- s2.push_back(s[i]);
- }
- ans.push_back('3');
- get(num + 1, ans, s1, 0,0);
- ans.pop_back();
- ans.push_back('4');
- get(num + 1, ans, s2, 0,0);
- ans.pop_back();
- ans.push_back('5');
- get(num + 1, ans, s1+s1, 0,0);
- ans.pop_back();
- ans.push_back('6');
- get(num + 1, ans, s2+s2, 0,0);
- ans.pop_back();
- }
- if (!(s[s.size() - 1] % 2) && !mult) {
- s1 = divide_by_2(s);
- ans.push_back('2');
- get(num + 1, ans, s1, 0, 1);
- ans.pop_back();
- }
- if (!div) {
- s1 = mult_by_2(s);
- ans.push_back('1');
- get(num + 1, ans, s1, 0, 1);
- ans.pop_back();
- }
- }
- string s;
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- hashes[0].q = 137;
- hashes[0].p = 937897;
- hashes[0].CntPows();
- //freopen("input.txt", "r", stdin);
- cin >> s;
- get(0, answ, s, 0, 0);
- if (MINANS == 1e3) {
- cout << -1;
- return 0;
- }
- cout << answ.size() << "\n";
- for (int i = 0; i < answ.size(); i++) {
- cout << answ[i];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement