#include <bits/stdc++.h>
using namespace std;
const int MAXS = 5000 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
int f[MAXS][MAXS];
int lc[MAXS][MAXS];
int l[MAXS][MAXS];
char s[MAXS];
int len;
void add(int &x, int y) { x = (x + y) % MOD; }
int main() {
  scanf("%s", s);
  len = strlen(s);
  for (int i = len; i > 0; --i) s[i] = s[i - 1];
  for (int i = len; i > 0; --i)
    for (int j = len; j > 0; --j)
      if (s[i] == s[j])
        lc[i][j] = lc[i + 1][j + 1] + 1;
      else
        lc[i][j] = 0;
  memset(f, 0, sizeof(f));
  f[1][1] = 1;
  for (int i = 1; i < len; ++i)
    for (int j = 1; j <= i; ++j) {
      add(f[i + 1][j + 1], f[i][j]);
      if (i + j > len) continue;
      int c = lc[i - j + 1][i + 1];
      if (c >= j || s[i - j + 1 + c] < s[i + 1 + c])
        add(f[i + j][j], f[i][j]);
      else if (s[i + 1] == '1')
        add(f[i + j + 1][j + 1], f[i][j]);
    }
  int sum = 0;
  for (int i = 1; i <= len; ++i) add(sum, f[len][i]);
  printf("%d\n", sum);
  memset(f, 0x3f, sizeof(f));
  f[1][1] = 1;
  for (int i = 1; i < len; ++i)
    for (int j = 1; j <= i; ++j) {
      f[i + 1][j + 1] = min(f[i + 1][j + 1], f[i][j]);
      if (i + j > len) continue;
      int c = lc[i - j + 1][i + 1];
      if (c >= j || s[i - j + 1 + c] < s[i + 1 + c])
        f[i + j][j] = min(f[i + j][j], f[i][j] + 1);
      else if (s[i + 1] == '1')
        f[i + j + 1][j + 1] = min(f[i + j + 1][j + 1], f[i][j] + 1);
    }
  int ans = INF;
  for (int i = len - 20 + 1; i <= len; ++i)
    if (f[len][len - i + 1] != INF) {
      int x = 0;
      for (int j = i; j <= len; ++j) x = (x * 2 + s[j] - '0') % MOD;
      add(x, f[len][len - i + 1]);
      if (ans > x) ans = x;
    }
  if (ans == INF) {
    for (int i = len - 20; i > 0; --i)
      if (f[len][len - i + 1] != INF) {
        int x = 0;
        for (int j = i; j <= len; ++j) x = (x * 2 + s[j] - '0') % MOD;
        add(x, f[len][len - i + 1]);
        if (ans > x) ans = x;
        break;
      }
  }
  printf("%d\n", ans);
  return 0;
}
