#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <list>
#include <set>
#include <numeric>
#include <queue>
#include <stack>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <climits>
#include <cfloat>
#include <ctime>
#include <complex>
#include <cassert>
#include <array>
#include <bitset> 
#include <unordered_map>
#include <random>

using namespace std;
typedef long long LL;
typedef pair<int,int> P;

void calcZ(char in[], int z[]){
	int l=-1,r=-1;
	for(int i=1;in[i];i++){
		int j=i;
		if(i<=r){
			if(z[i-l]<r-i+1){
				z[i]=z[i-l];
				continue;
			}
			j=r+1;
		}
		while(in[j]==in[j-i]){
			j++;
		}
		z[i]=j-i;
		if(z[i]){
			r=j-1;
			l=i;
		}
	}
}
const int L=5e5+1;
char in[L];
int z[2][L];
bool f[2][L];

int main() {
	scanf("%s",in);
	int s=strlen(in);
	calcZ(in,z[0]);
	reverse(in,in+s);
	calcZ(in,z[1]);
#if 0
	for(int i=0;i<s;i++){
		cerr << z[0][i] << " ";
	}
	cerr << endl;
#endif
	if(s==1){
		puts("1");
		puts("1");
		return 0;
	}
	if(z[0][1]==s-1){
		printf("%d\n%d\n",s,1);
		return 0;
	}
	for(int k=0;k<2;k++){
		for(int i=1;i<=s/2;i++){
			if(f[k][i])continue;
			for(int j=2*i;j<=i+z[k][i];j+=i){
				f[k][j]=true;
			}
		}
	}
	if(!f[0][s]){
		puts("1");
		puts("1");
		return 0;
	}
	puts("2");
	int ret=0;
	for(int i=1;i<s;i++){
		if(!f[0][i]&&!f[1][s-i]){
			//cerr << i << endl;
			ret++;
		}
	}
	printf("%d\n",ret);

	return 0;
}

