#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 2e6 + 5;
const long long MOD = 1e9 + 7;
char s[maxn], t[maxn];
int fail[maxn], refail[maxn];
void getfail(int *fail, char *s) {
  fail[0] = -1;
  int i = 0, j = -1;
  while (s[i]) {
    if (j == -1 || s[i] == s[j]) {
      fail[i + 1] = j + 1;
      i++;
      j++;
    } else {
      j = fail[j];
    }
  }
}
int main() {
  scanf("%s", &s);
  long long ans = 0;
  int len = strlen(s);
  for (int i = 0; s[i]; i++) {
    t[i] = s[len - i - 1];
  }
  t[len] = '\0';
  getfail(fail, s);
  getfail(refail, t);
  int m;
  if (fail[len] == 0 || len % (len - fail[len])) {
    m = 1;
  } else {
    m = 2;
  }
  bool flag = 1;
  for (int i = 1; s[i]; i++) {
    if (s[i] != s[i - 1]) {
      flag = 0;
    }
  }
  if (flag) {
    m = len;
  }
  if (m == 1 || flag) {
    ans = 1;
  } else {
    for (int i = 0; i < len - 1; i++) {
      int k = len - i - 1;
      if ((fail[i + 1] == 0 || (i + 1) % (i + 1 - fail[i + 1])) &&
          (refail[k] == 0 || k % (k - refail[k]))) {
        ans++;
        ans %= MOD;
      }
    }
  }
  cout << m << endl << ans % MOD << endl;
  return 0;
}
