結果
問題 | No.3028 No.9999 |
ユーザー |
|
提出日時 | 2025-02-21 22:39:28 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 2 ms / 4,000 ms |
コード長 | 2,109 bytes |
コンパイル時間 | 16,508 ms |
コンパイル使用メモリ | 393,696 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2025-02-21 22:39:46 |
合計ジャッジ時間 | 14,640 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
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}