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



using namespace std;



#define int long long



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

int has1[MAX], has2[MAX], n, pow27[MAX];

bool pre[MAX], suf[MAX], same = 1;

string s;



int gethas1(int i, int j) {

    return (has1[j] - (has1[i - 1] * pow27[j - i + 1]) % mod + mod) % mod;

}



int gethas2(int i, int j) {

    return (has2[i] - (has2[j + 1] * pow27[j - i + 1]) % mod + mod) % mod;

}



signed main () {

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

    cin >> s;

    n = s.size(); s = '*' + s;

    pow27[0] = 1; for (int i = 1; i < MAX; ++i) pow27[i] = (pow27[i - 1] * 27) % mod;

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

        if(s[i] != s[1]) same = 0;

    }

    if(same) {

        cout << n << '\n' << 1;

        return 0;

    }

    for (int i = 1; i <= n; ++i) has1[i] = (has1[i - 1] * 27 + s[i] - 'a' + 1) % mod;

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

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

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

            if(has1[i] != gethas1(j, j + i - 1) ) break;

            pre[j + i - 1] = 1;

        }

    }



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

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

            if(gethas2(n - i + 1, n) != gethas2(j - i + 1, j) ) break;

            suf[j - i + 1] = 1;

        }

    }



    if(!pre[n]) cout << "1\n1";

    else {

        cout << 2 << '\n';

        int cnt = 0;

        for (int i = 1; i < n; ++i) if(!pre[i] && !suf[i + 1]) cnt ++;

        cout << cnt;

    }



    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.113057359348138x):
#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;

}