#pragma GCC optimize("Ofast")
#pragma GCC target("sse4")
#include <bits/stdc++.h>
 
#define f(i,a,b) for( ll i = a; i < b ; i++ ) 
#define af(i,a,b) for( ll i = a; i >= b ; i--)
#define rep(i,a,b,k) for(ll i = a; i < b ; i+= k )
#define arep(i,a,b,k) for( ll i = a; i >= b ; i-= k)
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define sz(a) (int) a.size()
#define all(a) a.begin(), a.end()
#define sor(a) sort( a.begin(), a.end() )
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL)
#define inter ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
#define ln '\n'
#define nwln cout<<ln;
#define v(T) vector<T>
#define mins(i, j) (i = min(i, j))
 
// policy-based
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;   
 
 
using namespace std;

typedef bool oo;
typedef long long ll; // int or long long
typedef long double ld;
typedef pair<ll,ll> ii ;
typedef pair<ll,ii> iii;
typedef vector<ll>  vi ;
typedef vector<ii> vii ;
 
/*
typedef tree<
ll,
null_type,
less<ll>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
*/

const ll MAX = 100;
const ll inf = 1e18;
const ll mod = 1e9 + 7;
const ld EPS = 1e-9;

vi val[MAX+1][MAX+1];
set<vi> s;

bool vis[MAX][MAX],c[MAX][MAX];

int cc = 0;

bool valid(int x,int y){
	if(x<0 || y<0 || x>=MAX || y>=MAX || !c[x][y] || vis[x][y])
		return false;
	return true;
}

void dfs(int x,int y){
	cc++;
//	cout << x << " -"  << y  << endl;
	vis[x][y] = true;
	if(valid(x-1,y))
		dfs(x-1,y);
	if(valid(x+1,y))
		dfs(x+1,y);
	if(valid(x,y-1))
		dfs(x,y-1);
	if(valid(x,y+1))
		dfs(x,y+1);
}

void comprobe(vii v){
	for(int i = 0; i < MAX; i++)
		for(int j = 0; j < MAX; j++) c[i][j] = vis[i][j] = false;		
	for(auto it:v){
		c[it.first][it.second] = true;
	}
//	cout <<  endl;
//	f(i,0,MAX){
//		f(j,0,MAX) cout << (int) (c[i][j]);
//		cout << endl;
//	}
	dfs(v[0].first,v[0].second);
	cout << cc << " " << v.size() << endl;
	cc = 0;
}

int main(){
	int n;
	cin >> n;
	int k = 0;
	while( (1<<k) < n ) k++;
	cout << k << endl;
	for(int b = 0; b < 6; b++){	
		if(!k) break;
		k--;
		vii p;
		for(int i = 0; i < MAX; i++){
			p.push_back({i,0});
		}
		for(int i = 0; i < MAX; i++){
			if(i&(1<<b)){
				for(int j = 1; j < MAX; j++){
					p.push_back({i,j});
				}
			}
		}
		
		comprobe(p);
	//	cout << p.size();
	//	for(auto it:p) cout << " " << it.first << " " << it.second;
	//	cout << endl;

		for(auto it:p){
			val[it.first][it.second].push_back(b);
		}

	}
	for(int b = 0; b < 6; b++){	
		if(!k) break;
		k--;
		vii p;
		for(int i = 0; i < MAX; i++){
			p.push_back({0,i});
		}
		for(int i = 0; i < MAX; i++){
			if(i&(1<<b)){
				for(int j = 1; j < MAX; j++){
					p.push_back({j,i});
				}
			}
		}
		comprobe(p);
	//	cout << p.size();
	//	for(auto it:p) cout << " " << it.first << " " << it.second;
	//	cout << endl;

		for(auto it:p){
			val[it.first][it.second].push_back(6+b);
		}
	}
	for(int i = 0; i < MAX; i++) 
		for(int j = 0; j < MAX; j++) s.insert(val[i][j]);

	cout << s.size() << endl;
//	for(auto it:s) {
//		for(auto x:it) cout << x << " ";
//			cout << endl;
//	}
	return 0;
}