Problem:
Score : 200 points

Problem Statement

You are given positive integers A and B.

Find the K-th largest positive integer that divides both A and B.

The input guarantees that there exists such a number.

Constraints

All values in input are integers.

1 \leq A, B \leq 100

The K-th largest positive integer that divides both A and B exists.

K \geq 1

Input

Input is given from Standard Input in the following format:

A B K

Output

Print the K-th largest positive integer that divides both A and B.

Sample Input 1

8 12 2

Sample Output 1

2

Three positive integers divides both 8 and 12: 1, 2 and 4.
Among them, the second largest is 2.

Sample Input 2

100 50 4

Sample Output 2

5

Sample Input 3

1 1 1

Sample Output 3

1

Solution in Rust (1.42.0) (judge verdict: Accepted)

#![allow(non_snake_case)]
#![allow(unused_imports)]
#![allow(dead_code)]
 
use proconio::{input, fastout};
use proconio::marker::*;
use whiteread::parse_line;
use std::collections::*;
use num::*;
use num_traits::*;
use superslice::*;
use std::ops::*;
 
use itertools::Itertools;
use itertools_num::ItertoolsNum;

pub fn enum_divisors<T: PrimInt + NumAssign>(n: T) -> Vec<T> {
    let mut res: Vec<T> = Vec::new();
    let mut i: T = one();
    while i * i <= n {
        if n % i == zero() {
            res.push(i);
            if n / i != i {
                res.push(n / i)
            }
        }
        i += one();
    }
    res.sort();
    res
}

#[fastout]
fn solve() {
    const MOD: usize = 1_000_000_007;
    const INF: usize = std::usize::MAX;

    input!{
        a: usize, b: usize, k: usize,
    }

    let a_div = enum_divisors(a).into_iter().collect::<HashSet<usize>>();
    let b_div = enum_divisors(b).into_iter().collect::<HashSet<usize>>();

    let mut intersect_vec: Vec<&usize> = a_div.intersection(&b_div).collect();
    intersect_vec.sort();
    intersect_vec.reverse();

    for (i, d) in intersect_vec.iter().enumerate() {
        if i+1 == k {
            println!("{}", d);
            break;
        }
    }
}

fn main() {
    solve();
}