use proconio::input; fn main() { input! { n: usize, } println!("{}", solve(n)); } fn solve(n: usize) -> usize { if n == 1 { return 1; } let factors = prime_factorization(n); let carmichael = factors.iter().fold(1_usize, |lcm, &(p, e)| { calc_lcm(lcm, p.pow(e as u32 - 1) * (p - 1)) }); *find_divisors(carmichael) .iter() .find(|&&d| pow_mod(10, d, n) == 1) .unwrap() } /// Creates a sequence consisting of the divisors of `n`. pub fn find_divisors(n: usize) -> Vec<usize> { assert_ne!(n, 0, "`n` must be at least 1."); let mut divisors = vec![]; for i in (1..).take_while(|&i| i <= n / i) { if n % i == 0 { divisors.push(i); if n / i != i { divisors.push(n / i); } } } divisors.sort_unstable(); divisors } /// Performs prime factorization of `n`. /// /// The result of the prime factorization is returned as a /// list of prime factor and exponent pairs. pub fn prime_factorization(n: usize) -> Vec<(usize, usize)> { assert_ne!(n, 0, "`n` must be at least 1."); let mut factors = vec![]; let mut t = n; for p in 2.. { if p * p > t { break; } let mut e = 0; while t % p == 0 { t /= p; e += 1; } if e != 0 { factors.push((p, e)); } } if t != 1 { factors.push((t, 1)); } factors } /// Calculate the remainder of `exp` power of `base` divided by `m`. pub fn pow_mod(base: usize, exp: usize, m: usize) -> usize { let mut ret = 1 % m; let mut mul = base % m; let mut t = exp; while t != 0 { if t & 1 == 1 { ret = ret * mul % m; } mul = mul * mul % m; t >>= 1; } ret } fn calc_gcd(a: usize, b: usize) -> usize { let (mut a, mut b) = (a, b); while b != 0 { let r = a % b; a = b; b = r; } a } fn calc_lcm(a: usize, b: usize) -> usize { a / calc_gcd(a, b) * b }