// Slower C++ solution:
#include<bits/stdc++.h>



using namespace std;



#define int long long

#define For(i, a, b) for(int i = a; i <= b; ++ i)

const int N = 5e5 + 5, mod = 1e9 + 7;



int l, q;

string s;

int _hash[N], Hash[N], Pow[N];

bool pre[N], suf[N];



int get_hash(int l, int r){

	return (_hash[r] - _hash[l - 1] * Pow[r - l + 1] + mod * mod ) % mod;

}

int get_hash2(int l, int r){

	return (Hash[l] - Hash[r + 1] * Pow[r - l + 1] + mod * mod ) % mod;

}

signed main(){

	ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);

	cin >> s;

	int len = s.length();

	s = "." + s;

	int ok = 0;

	For(i, 1, len) if(s[i] != s[1]){ ok = 1; break; }

	if(!ok){ cout << len << "\n" << 1; return 0; }

	Pow[0] = 1;

	For(i, 1, N - 1) Pow[i] = Pow[ i - 1] * 27 % mod;

	

	For(i, 1, len) _hash[i] = (_hash[i - 1] * 27 + s[i] - 'a' + 1) % mod;

	for(int i = len; i > 0; -- i) Hash[i] = (Hash[i + 1] * 27 + s[i] - 'a' + 1) % mod;

	

	For(i, 1, len){

		for(int j = i + 1; j + i - 1 <= len; j += i){

			if(_hash[i] != get_hash(j, j + i - 1)) break;

			pre[j + i - 1] = true;

		}

	}

	for(int i = len ; i > 0; -- i){

		int val = get_hash2(len - i + 1, len);

		for(int j = len - i; j - i + 1 > 0; j -= i){

			if(val != get_hash2(j - i + 1, j)) break;

			suf[j - i + 1] = true;

		}

	}

	if(!pre[len]){ cout << 1 << "\n" << 1; return 0; }

	int dem = 0;

	For(i, 1, len - 1) if(!pre[i] && !suf[i + 1]) dem ++;

	cout << 2 << "\n" << dem;

}

// Faster C++ solution for the same problem (measured speedup: 4.998315497635604x):
#include <bits/stdc++.h>

using namespace std;

typedef long long lint;

typedef unsigned long long ulint;

typedef pair<int, int> pii;

typedef pair<lint, lint> pll;

#define endl '\n'

#define next next_

#define fst first

#define sed second

#define pb push_back

#define mp make_pair

#define rint register int

#define newline putchar('\n')

#define leave_space puthchar(' ')

#define all(x) (x).begin(), (x).end()

#define reveal(x) cerr << #x << " = " << (x) << endl

#define rep(it, f, e) for (rint it = f; it <= e; ++it)

#define per(it, f, e) for (rint it = f; it >= e; --it)

const int MAXN = 5e5 + 20;

char s[MAXN], t[MAXN];

int n, fail1[MAXN], fail2[MAXN];

/*inline void getfail(int fail[], char S[]) {

	int j = fail[0] = -1;

	rep (i, 1, n - 1) {

		while(j >= 0 && S[i] != S[j]) j = fail[j];

		fail[i + 1] = ++j;

	}

}*/

inline void getfail(int *fail, char *s) {

    fail[0] = -1;

    int j = 0;

    for (int i = 1; i < n; ++i) { 

        while (j && s[i] != s[j]) j = fail[j];

        if (s[i] == s[j]) fail[i + 1] = ++j;

        else fail[i + 1] = 0;

    }

}

inline bool check_cyc1(int x) {

	return fail1[x] == 0 || x % (x - fail1[x]);

}

inline bool check_cyc2(int x) {

	if (x == 0) return false;

	return fail2[x] == 0 || x % (x - fail2[x]);

}

int main() {

	scanf("%s", s);

	n = strlen(s);

	//memcpy(t, s, sizeof(t));

	for (int i = 0; i < n; ++i) t[i] = s[n - i - 1];

	getfail(fail1, s);

	getfail(fail2, t);

	int res = check_cyc1(n) ? 1 : 2;

	bool flag = true;

	rep (i, 1, n - 1) {

		if (s[i] != s[i - 1]) {

			flag = false;

			break;

		}

	}

	if (flag) {

		cout << n << endl;

		cout << 1 << endl;

	} else if (res == 1) {

		cout << 1 << endl;

		cout << 1 << endl;

	} else {

		int ans = 0;

		rep (i, 0, n - 1) {

			ans += (check_cyc1(i + 1) && check_cyc2(n - i - 1));

		}

		cout << 2 << endl;

		cout << ans << endl;

	}

	return 0;

}