#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cstring>
#include <algorithm>
#include <ctype.h>
using namespace std;
bool temp;
long long arr[(int)1e3 + 1];

void swap(long long &x, long long &y){
    int temp;
    temp = x;
    x = y;
    y = temp;
  }
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
//	long long x,y,min,min2;
//	min = 1000000000000;
//	min2 = 1000000000000;
//	cin >> x;
//	for(int i = 1; i <= x; i++){
//		cin >> y;
//		if(y < min){
//			min = y;
//		}else if(y < min2){
//			min2 = y;
//		}
//	}
//	cout << min2 << endl;

//	long long ar[1000000000];
//	for(int i = 0; i < 1005; i++){
//		ar[i] = 0;
//	}
//	long long x;
//	cin >> x;
//	for(int i = 0;i < x; i++){
//		long long y; cin >> y;
//			ar[y]++;
//	}
//	int modus = 0;
//	int max = 0;
//	for(int i = 1; i <= 10000000000; i++){
//		if(max <= ar[i]){
//			max = ar[i];
//			modus = i;
//		}
//	}
//	cout << modus << endl;
	
//	long long x,y,z;
//	long long min = 10000000;
//	z = 0;
//	cin >> x;
//	for(int i = 1; i <= x; i++){
//		cin >> y;
//		ar[i] = y;
//	}
//	for(int i = x-1; i>=0 ; i--){
//		if(ar[i] < min){
//			min = ar[i];
//			z = z + ar[i];
//		}else if (ar[i] > min){
//			min = ar[i];
//			z = z + min;
//			
//		}	
//		
//	}
//	cout << z << endl;

//	long long x,y,z;
//	z = 0;
//		cin >> x;
//	for(int i = 1; i <= x-1;i++){
//		cin >> y;	
//	}
//	for(int i = 1; i <= x-1;i++){
//		ar[i] = i;
//		if(ar[i] != ar[y]){
//			z = ar[i];
//		}
//	}
//	cout << z << endl;

//int calc(int x){
//  int d = 0;
//  while(x > 0){
//    d += x % 10;
//    x /= 10;
//  }
//  return d;
//}
//
//int main() {
//  int a,b,c,d;
//  while(cin >> a){
//    if(a == 0){
//      return 0;
//    }
//    while(a >= 10){
//      a = calc(a);
//    }
//    cout << a << endl;
//  }
//}

//long long a,b,c,d,e,f,g,min;
//  bool temp;
//  temp = true;
//  min = 1000000000;
//  while(cin >> a >> b >> c >> d){
//    
//    for(int i = 1; i <= c; i++){
//      cin >> e;
//      for(int j = 1; j <= d; j++){
//        cin >> f;
//        if(a <= f && b >= a * e){
//          if(min > a * e){
//            min = a * e;
//            temp = true;
//          }
//        }
//        else{
//          temp = false;
//        }
//      }
//    }
//    if(temp == true){
//      cout << min << endl;
//    } 
//    else{
//      cout << "stay home" << endl;
//    }
//  }
//

// int h,d,cnt;
//  double f,tmp,x,u;
//	bool haha;
//  tmp = 0;
//	haha = false;
//	cnt = 0;
//	while(cin >> h >> u >> d >> f){
//		if(h == 0){
//			return 0;
//		}
//    
//    x = f/100 * u;
//		for(int i = 1;i <= 100000; i++){
//			if(i == 1){
//        tmp += u;
//				cnt++;
//			}else if(i > 1){
//        u -= x;
//				if(u >= 0)tmp += u;
//				cnt++;
//			}
//
//      if(tmp > h){
//			  haha = true;
//        break;
//			}
//
//      tmp -= d;
//
//      if(tmp < 0){
//        break;
//      }
//
//		}
//
//    if(haha == true){
//      cout << "success on day " << cnt << endl;
//    }else{
//      cout << "failure on day " << cnt << endl;
//    }
//
//		haha = false;
//		cnt = 0;
//    tmp = 0;
//	}
//  int x,y,z,a;
//  a = 0;
//  bool temp;
//  temp = true;
//  string w;
//  while(cin >> w){
//    a++;
//    cout << "Case " << a << ":" << endl;
//    cin >> x;
//    for(int i = 1; i <= x; i++){
//      cin >> y >> z;
//      if(z > y){
//        for(int j = y; j < z; j++){
//          if(w[j] != w[j + 1]){
//            temp = false;
//            break;
//          }
//        }
//      }else{
//        for(int k = z; k < y; k++){
//          if(w[k] != w[k + 1]){
//            temp = false;
//            break;
//          }
//        }
//      }
//      if(temp == true){
//        cout << "Yes" << endl;
//      }else{
//        cout << "No" << endl;
//      }
//      temp = true;
//    }
//  }


//	int price[256];
//
//int main(){
//  int n,k,x;
//  double cnt, m;
//  cnt = 0;
//  string z;
//  char a;
//  cin >> n;
//  for(int o = 1; o <= n; o++){
//    cin >> k;
//    for(int j = 1; j <= k;j++){
//      cin >> a >> m;
//      price[a] = m;
//    }
//    cin >> x; cin.ignore();
//    
//    for(int i = 1; i <= x ;i++){
//      getline(cin,z);
//      
//      for(int j = 0; j < z.length(); j++){
//        cnt += price[z[j]];
//      }
//    }
//    cnt = cnt / 100;  
//    
//    cout << fixed << setprecision(2) << cnt << "$" << endl;
//    cnt = 0;
//    for(int a = 0;a < 256; a++){
//      price[a] = 0;
//    }
//  }
//  
//
//int x,r,s;
//  // Big O Notation
//
//  // Kompleksitas = O(N^3)
//
//  // O(x * MAXS * r) cari jawaban
//	cin >> x;
//	for(int i = 1;i <= x;i++){
//    int min = 1e9;
//		cin >> r;
//		for(int k = 1; k <= r;k++){
//			cin >> s;
//			ar[k] = s;
//		}
//
//    for(int j =1; j <= 30000; j++){
//      // Ini kan berarti rumah vito sekarang di j
//      // Harus cari tau dari j ke rumah 1, 2, 3, ... ,r
//      // jaraknya masing-masing berapa terus ditotal
//
//      int sumDist = 0; // Buat nyimpen total jarak ke semua rumah
//
//      for(int k = 1; k <= r; ++k){ // Cek ke semua tetangga2nya
//        sumDist += abs(j - ar[k]);
//        // Tambahin jarak dari rumah sekarang ke tetangga ke-k
//      }
//
//      if(min > sumDist){
//        min = sumDist;
//      }
//    }
//
//    cout << min << endl;
//	}

//string x;
//  cin >> x;
//  for(int i = 0; i <= x.length() - 1; ++i){
//    x[i] = tolower(x[i]);
//    if(x[i] == 'a' || x[i] == 'o' ||x[i] == 'y'||x[i] == 'e'||x[i] == 'u'||x[i] == 'i'){
//      continue;
//    }else{ 
//      cout << "." << x[i];
//    }
//  }
//  cout << endl;
//}
//	int a,cnt;
//  cnt = 0;
//  for(int i = 0;i < 4; i++){
//    cin >> a;
//    ar[i] = a;
//  }
//  for(int i = 0; i < 4; i++){
//    if(ar[i] == ar[i+1]|| ar[i] == ar[i+2] || ar[i] == ar[i+3]){
//      cnt++;
//    }
//  }
//  cout << cnt << endl;
//
//long long x,y,temp,cnt;
//bool idk;
//idk = true;
//  cin >> x;
//  cin >> y;
//  temp = y;
//  for(int i = 2; i <= x; i++){
//    cin >> y;
//    if(temp == y){
//      idk = false;
//      break;
//    }else if(temp > y){
//      temp = y;
//      cnt = i;
//    }
//    }
//    if(idk == true){
//    	cout << cnt << endl;
//	}else{
//		cout << "Still Rodzilla" << endl;
//	}

//int x,y;
//  for(int i = 1; i <= 3; i++){
//    for(int j = 1; j <= 3; j++){
//      arr[i][j] = 1;
//    }
//  }
//  for(int i = 1; i <= 3; i++){
//    for(int j = 1; j <= 3; j++){
//      cin >> x;
//      arr[i][j] += x;
//      arr[i+1][j] += x;
//      arr[i-1][j] += x;
//      arr[i][j+1] += x;
//      arr[i][j-1] += x;
//    }
//  }
//  for(int i = 1; i <= 3;i++){
//    for(int j = 1; j <= 3; j++){
//      arr[i][j] = arr[i][j] % 2;
//      cout << arr[i][j];
//    }
//    cout << endl;
//  }

// floodfill
//const int N = 100;
//char grid[N + 5][N + 5];
//bool vis[N + 5][N + 5];
//int dx[4] = {0, 1, 0, -1};
//int dy[4] = {1, 0, -1, 0};
//int n, m;		
//
//bool inRange(int x, int y){
//  return x >= 0 && y >= 0 && x < n && y < m;
//}
//
//void floodfill(int x, int y){
//  if(vis[x][y])return; // udah pernah dibanjirin
//  vis[x][y] = true;
//
//  for(int i = 0; i < 4; ++i){
//    int nx = x + dx[i];
//    int ny = y + dy[i];
//    if(inRange(nx, ny) && grid[nx][ny] == '.')
//      floodfill(nx, ny);
//  }
//  
//}
//
//int main() {
//  ios::sync_with_stdio(false);
//  cin.tie(0); cout.tie(0);
//  cin >> n >> m;
//
//  for(int i = 0; i < n; ++i){
//    for(int j = 0; j < m; ++j){
//      cin >> grid[i][j];
//    }
//  }
//
//  int ans = 0;
//  for(int i = 0; i < n; ++i){
//    for(int j = 0; j < m; ++j){
//      if(grid[i][j] == '#')continue;
//      if(vis[i][j])continue;
//
//      floodfill(i, j);
//
//      ans++;
//    }
//  }
//
//  cout << ans << endl;
//  
//}

//int x,y;
//  cin >> x;
//  for(int i = 0; i < x; i++){
//    cin >> y;
//    arr[i] = y;
//  }
//  for(int i = 0; i < x - 1; i++){
//    for(int j = 0; i < x-j-1; j++){
//      if(arr[j] > arr[j+1]){
//        swap(arr[j],arr[j+1]);
//        temp = true;
//      }
//      }
//    if(temp == false){
//    	break;
//    }
//  }
//  for(int i = 0; i < x; i++){
//    cout << arr[i] << endl;
//  }
//  }

//	int a,b,c,cnt;
//	cin >> a >> b >> c;
//	if(b / a > c){
//		cout << c << endl;
//	}else{
//		cout << b/a << endl;
//	}

//	const int N = 1e4;
//int pos[N + 5];
//
//int main(){
//  ios::sync_with_stdio(false);
//  cin.tie(0); cout.tie(0);
//  int n;
//  while(cin >> n){
//
//    if(n == 0)break;
//
//    char c; cin >> c;
//    for(int i = 0; i < n; ++i){
//      int x; cin >> x;
//      pos[x] = i;
//    }
//
//
//    bool aritmatika = false;
//    // patokin nilai pertamanya dari deret aritmatika
//    // misalkan kita patokin a1 = 0
//
//    for(int i = 0; i < n; ++i){
//      // Harus cobain untuk semua kemungkinan deret aritmatika
//      // Bisa jadi selang 1, 2, 3, 4, 5 ...
//      // Contoh : a1 = 3, selangnya 2, a1 = 3, a2 = 5, a3 = 7
//      for(int j = 1; j < n; ++j){
//        int a1 = i, a2 = a1 + j, a3 = a2 + j;
//        // Cek a1, a2, a3 harus diantara 0-(n-1)
//        if(a3 < n){
//          // Valid secara jangkauan, (a1,a2,a3) ada diantara 0-(n-1)
//          if(pos[a1] < pos[a2] && pos[a2] < pos[a3]){
//            aritmatika = true;
//          }
//        }
//
//        // Cek selisih yang negatif
//        a1 = i, a2 = a1 - j, a3 = a2 - j;
//        if(a3 >= 0){
//          if(pos[a1] < pos[a2] && pos[a2] < pos[a3]){
//            aritmatika = true;
//          }
//        }
//      }
//    }
//
//    cout << ((aritmatika)?"no":"yes") << endl;
//  }
//}

//int matrix[105][105];
//int temp [105];
//int temp2[105];
//int main (){
//  bool a = true;;
//  int x,y,cnt,cnt2,count,count2,l,k;
//  count = 0;
//  count2 = 0;
//  cnt = 0;
//  cnt2 = 0;
//  while(cin >> x){
//    if(x == 0){
//      return 0;
//    }
//  
//    for(int i = 0; i < x; i++){
//      for(int j = 0; j < x;j++){
//        cin >> y;
//        matrix[i][j] = y;
//      }
//    }
//
//    for(int i = 0; i < x; i++){
//      for(int j = 0; j < x;j++){
//        if(matrix[i][j] == 1){
//          cnt++;
//        }
//        
//        if(matrix[j][i] == 1){
//          cnt2++;
//        }
//        
//        if(j == x-1){
//          temp[i] = cnt;
//          temp2[i] = cnt2;
//          cnt2 = 0;
//          cnt = 0;
//          break;
//        }
//      }
//    }
//
//    for(int i = 0; i < x; i++){
//      if(temp[i] % 2 == 1){
//        a = false;
//        count++;
//        k = i;
//      }
//
//      if(temp2[i] % 2 == 1){
//        a = false;
//        count2++;
//        l = i;
//      }
//    }
//    if(a == true){
//      cout << "OK" << endl;
//    }else if(a == false && count == 1 && count2 == 1){
//      cout << "Change bit " << '(' << k + 1 << ',' << l + 1 << ')' << endl;
//    }else{
//      cout << "Corrupt" << endl;
//    }
//    cnt = 0;
//    cnt2 = 0;
//    count = 0;
//    count2 = 0;
//    a = true;
//  }
//}
//	

int x,y,k,cnt,temp;
cnt = 0;
temp = 0;
cin >> x >> y >> k;
for(int i = 100; i > 0; i--){
	if(x % i == 0 && y % i == 0){
		cnt++;
		if(cnt == k){
			cout << i << endl;
	}
}

}
}




Measured memory_bytes: 256