#include <bits/stdc++.h>
using namespace std;
char s[5005];
int dp[5005][5005], f[5005][5005], cnt[5005][5005];
int main() {
  int T, i, j, ca = 0, m, n, k;
  while (~scanf("%s", s + 1)) {
    n = strlen(s + 1);
    for (i = n; i > 1; i--)
      for (j = i; j <= n; j++) {
        if (i == j)
          dp[i][j] = 1;
        else {
          if (i + dp[i][j] < j) {
            if (s[i - 1] == s[j - 1])
              dp[i - 1][j - 1] = dp[i][j] + 1;
            else
              dp[i - 1][j - 1] = 0;
          }
        }
      }
    for (i = 0; i <= n; i++)
      for (j = 0; j <= n; j++) f[i][j] = 1000000007;
    cnt[1][1] = 1;
    f[1][1] = 1;
    for (j = 1; j < n; j++)
      for (i = 1; i <= j; i++) {
        (cnt[i][j + 1] += cnt[i][j]) %= 1000000007;
        f[i][j + 1] = min(f[i][j + 1], f[i][j]);
        if (s[j + 1] == '0') continue;
        int d = dp[i][j + 1];
        k = j - i + 1;
        if (d == k || s[i + d] <= s[j + 1 + d])
          ;
        else
          k++;
        if (j + k <= n) {
          int first = j + k;
          (cnt[j + 1][first] += cnt[i][j]) %= 1000000007;
          f[j + 1][first] = min(f[j + 1][first], f[i][j] + 1);
        }
      }
    int ans = 0;
    const long long INF = 1000000007 + 1000000;
    for (i = 1; i <= n; i++) {
      (ans += cnt[i][n]) %= 1000000007;
    }
    printf("%d\n", ans);
    long long best = INF, ep = 1, res = 0;
    bool big = 0;
    for (i = n; i >= 1; i--) {
      res += ep * (s[i] - '0');
      if (res >= INF) {
        if (best < INF) break;
        res -= 1000000007;
        big = 1;
      }
      if (f[i][n] <= n) {
        best = min(best, res + f[i][n]);
        if (big) break;
      }
      ep <<= 1;
      if (ep >= INF) big = 1;
      ep %= 1000000007;
    }
    printf("%d\n", best % 1000000007);
  }
  return 0;
}
