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.15.1) (judge verdict: Accepted)

use std::collections::HashSet;

#[allow(unused_macros)]
macro_rules! invec {
    ( $t:ty ) => {{
        let mut s = String::new();
        match std::io::stdin().read_line(&mut s) {
            Ok(0) => Vec::<$t>::new(),
            Ok(n) => s.trim().split_whitespace().map(|s| s.parse::<$t>().unwrap()).collect::<Vec<$t>>(),
            Err(_) => Vec::<$t>::new(),
        }
    }}
}

#[allow(unused_macros)]
macro_rules! input {
    ( $($t:ty),* ) => {{
        let mut s = String::new();
        std::io::stdin().read_line(&mut s);
        let mut splits = s.trim().split_whitespace();
        ($(
            {
                 splits.next().unwrap().parse::<$t>().unwrap()
            },
        )*)
    }}
}

fn divisors(n: u32) -> Vec<u32> {
    (1..(n + 1)).filter(|m| n % m == 0).collect()
}

#[allow(unused_must_use)]
#[allow(unused_variables)]
fn solve() {
    let (a, b, k) = input!(u32, u32, usize);

    let avec: HashSet<u32> = divisors(a).into_iter().collect();
    let bvec: HashSet<u32> = divisors(b).into_iter().collect();
    let mut ab = avec.intersection(&bvec).collect::<Vec<&u32>>();
    ab.sort();
    ab.reverse();

    println!("{}", ab[k - 1]);
}

fn main() {
    solve();
}