#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5005;
const unsigned long long MOD = 1000000007;
const int INF = 1000000000;
int N, nxt[MAXN], cnt[MAXN][MAXN], len[MAXN][MAXN], tot = 1, sh;
string S;
unsigned long long P[MAXN], H[MAXN];
inline unsigned long long get(int p, int l) {
  return (H[p + l] - H[p]) * P[N - p];
}
inline bool comp(int a, int b, int l) {
  int lo = 0, hi = l, mid = (lo + hi) / 2;
  for (; lo < mid; mid = (lo + hi) / 2)
    (get(a, mid) == get(b, mid) ? lo : hi) = mid;
  return S[a + lo] < S[b + lo];
}
void pre() {
  N = S.size();
  int l = 0;
  P[0] = 1;
  for (int i = 0; i < N; i++) {
    P[i + 1] = MOD * P[i];
    H[i + 1] = H[i] + P[i] * S[i];
    nxt[i] = -1;
    while (l <= i && S[i] == '1') nxt[l++] = i;
  }
  for (int i = 0; i < N; i++) {
    for (int j = 0; j <= N; j++) {
      if (i == 0) {
        cnt[j][i] = 1;
        len[j][i] = 1;
      } else
        len[j][i] = INF;
    }
  }
}
int main() {
  cin >> S;
  pre();
  int p = 1, v = 0;
  for (int i = N - 1; i >= 0; i--) {
    v = (v + p * (S[i] - '0')) % MOD;
    p = 2 * p % MOD;
  }
  sh = (v + 1) % MOD;
  for (int i = 1; i < N; i++) {
    int t = 0, m = INF, p = i - 1;
    for (int j = i + 1; j <= N; j++) {
      if (S[i] == '0') continue;
      int l = j - i, s = max(i - l, 0);
      if (s == i - l && comp(i, s, l)) s++;
      s = nxt[s];
      if (s < 0) continue;
      for (; p >= s; p--) {
        t = (t + cnt[i][p]) % MOD;
        m = min(m, len[i][p] + 1);
      }
      cnt[j][i] = t;
      len[j][i] = min(m, INF);
      if (j == N) {
        tot = (tot + t) % MOD;
        int p = 1, v = 0;
        for (int k = j - 1; k >= i; k--) {
          v = (v + p * (S[k] - '0')) % MOD;
          p = 2 * p % MOD;
        }
        if (m < INF) {
          if (v < 10000)
            sh = min(sh, v + m);
          else
            sh = (v + m) % MOD;
        }
      }
    }
  }
  cout << tot << '\n' << sh << '\n';
}
