#include <bits/stdc++.h>
using namespace std;


#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using ll = long long;

/* vector<int> A(N); 
    vector<pair<int, int> > tasks; ＃ソートした場合、１つ目でソート
　tie(b, a) = p.at(i); #pairを分割
    tasks.emplace_back(b, a)  ＃配列tasksの最後に(b,a)を追加
　xの二乗:  pow(x, 2.0) 
    小さい順: sort(v.begin(), v.end());
    大きい順: reverse(v.begin(), v.end());
    int: -2,147,483,648 ～ 2,147,483,647
    ll: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
    // int型の2次元配列(3×4要素の)の宣言
    vector<vector<int>> data(3, vector<int>(4));
*/

/* xとyの最大公約数を求める */

int gcd(ll x, ll y){
  if(x<y)return gcd(y,x);
  else{
    ll r=x%y;
    if(r!=0)return gcd(y,r);
    else return y;
  }
}

int gcd3(ll x, ll y, ll z){
	int a = gcd(x,y);
  	int b = gcd(a,z);
  	 return b;
}
 
int main() {
  
  ll A, B, C, count=0, ans=0;
  string D, E;
  cin >> A;
  
  rep(x,A){
  	rep(y,A){
    	rep(z,A){
          	count+= gcd3(x,y,z);
        }
    }
  }
  
  cout << count << endl;
}
