#include <bits/stdc++.h>
using namespace std;
bool DEBUG = true;
int solve(int base) {
int bound = (base - 1) * (base - 2) + 1;
auto adjust = [&](vector<int> mask, int digit) {
vector<int> ret(bound, 0);
for(int i = 0; i < bound; ++i)
if(mask[i]) {
ret[abs(i - digit)] = 1;
if(i + digit < bound)
ret[i + digit] = 1;
}
return ret;
};
map<vector<int>, int> Hash;
vector<int> diff;
vector<vector<int> > trans;
function<int(vector<int>)> dfs;
dfs = [&](vector<int> cur) {
auto iter = Hash.find(cur);
if(iter != Hash.end())
return iter -> second;
int idx = Hash.size();
Hash[cur] = idx;
if(DEBUG && Hash.size() % (int)1e4 == 0)
cerr << "collected " << Hash.size() << " states" << endl;
for(int i = 0; i < base; ++i)
if(cur[i]) {
diff.push_back(i);
break;
}
trans.push_back(vector<int>(base, -1));
for(int i = 0; i < base; ++i)
trans[idx][i] = dfs(adjust(cur, i));
return idx;
};
vector<int> origin(bound, 0);
origin[0] = 1;
dfs(origin);
if(DEBUG)
cerr << "collected " << Hash.size() << " states" << endl;
int size = base;
vector<int> pos(diff);
for(int i = 0; i < base; ++i) {
vector<int> pos2;
map<vector<int>, int> Hash2;
for(int j = 0; j < Hash.size(); ++j) {
vector<int> vec;
vec.push_back(diff[j]);
for(int k = 0; k < base; ++k)
vec.push_back(pos[trans[j][k]]);
auto iter = Hash2.find(vec);
if(iter != Hash2.end())
pos2.push_back(iter -> second);
else {
int idx = Hash2.size();
pos2.push_back(Hash2[vec] = idx);
}
}
if(size == Hash2.size())
break;
if(DEBUG)
cerr << "distinct states: " << size << " -> " << Hash2.size() << endl;
size = Hash2.size();
pos = move(pos2);
}
return size;
}
int main() {
int base;
while(cin >> base)
cout << "number of states: " << solve(base) << endl;
return 0;
}