#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T sqr(T x) {
  return x * x;
}
const int INF = 0x3fffffff;
const double PI = acos(-1.0);
using namespace std;
char s[5005];
int dp[5005][5005];
int mi[5005][5005];
int lcp[5005][5005];
void Add(int &ans, int v) {
  ans += v;
  if (ans >= 1000000007) ans -= 1000000007;
}
void Min(int &ans, int v) {
  if (ans > v) ans = v;
}
bool large(int i, int j, int len) {
  if (lcp[i][j] >= len)
    return 1;
  else
    return j == 0 || s[i + lcp[i][j] - 1] > s[j + lcp[i][j] - 1];
}
int solve(int i) {
  int ans = 0;
  for (int j = i - 1; s[j]; j++) {
    Add(ans, ans + s[j] - '0');
  }
  return ans;
}
int main(void) {
  memset(mi, 0x3f, sizeof(mi));
  scanf("%s", s);
  int n = strlen(s);
  dp[1][0] = 1;
  mi[1][0] = 0;
  for (int i = n; i >= 1; i--) {
    for (int j = n; j >= 0; j--) {
      if (s[i - 1] == s[j - 1])
        lcp[i][j] = lcp[i + 1][j + 1] + 1;
      else
        lcp[i][j] = 0;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < i; j++) {
      if (j) {
        Add(dp[i + 1][j], dp[i][j]);
        Min(mi[i + 1][j], mi[i][j]);
      }
      int len = i - j;
      if (s[i - 1] == '1') {
        if (large(i, j, len)) {
          if (i + len <= n + 1) {
            Add(dp[i + len][i], dp[i][j]);
            Min(mi[i + len][i], mi[i][j] + 1);
          }
        } else {
          len++;
          if (i + len <= n + 1) {
            Add(dp[i + len][i], dp[i][j]);
            Min(mi[i + len][i], mi[i][j] + 1);
          }
        }
      }
    }
  }
  int ans = 0;
  int ret = INF, ret1 = INF;
  for (int i = 1; i <= n; i++) {
    if (s[i - 1] == '1') {
      Add(ans, dp[n + 1][i]);
      if (mi[n + 1][i] != 0x3f3f3f3f && i + 25 >= n) {
        ret = min(ret, (solve(i) + mi[n + 1][i]) % 1000000007);
      }
      if (i + 25 < n && mi[n + 1][i] != 0x3f3f3f3f) {
        ret1 = (solve(i) + mi[n + 1][i]) % 1000000007;
      }
    }
  }
  if (ret == INF) ret = ret1;
  printf("%d\n", ans);
  printf("%d\n", ret);
  return 0;
}
