結果
問題 |
No.3127 Multiple of Twin Prime
|
ユーザー |
|
提出日時 | 2025-04-25 21:46:41 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 191 ms / 2,500 ms |
コード長 | 3,003 bytes |
コンパイル時間 | 29,981 ms |
コンパイル使用メモリ | 397,656 KB |
実行使用メモリ | 37,340 KB |
最終ジャッジ日時 | 2025-04-25 21:47:19 |
合計ジャッジ時間 | 16,569 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 12 |
ソースコード
fn main() { input! { t: usize, n: [usize; t], } let mut products = vec![]; let sieve = LinearSieve::new(10_000_000); for pq in sieve.primes().windows(2) { let p = pq[0]; let q = pq[1]; if p + 2 == q { products.push(p * q); } } for n in n { let k = products.partition_point(|&x| x <= n ); if k == 0 { println!("-1"); } else { println!("{}", products[k - 1]); } } } use proconio::*; use primes::*; pub mod primes { // Last Update: 2025-01-12 18:20 type N = usize; pub struct LinearSieve { limit: usize, primes: Vec<usize>, table: Vec<usize> } impl LinearSieve { const REM: [usize; 8] = [1, 7, 11, 13, 17, 19, 23, 29]; const IDX: [usize; 30] = [8, 0, 8, 8, 8, 8, 8, 1, 8, 8, 8, 2, 8, 3, 8, 8, 8, 4, 8, 5, 8, 8, 8, 6, 8, 8, 8, 8, 8, 7]; pub fn new(limit: N) -> Self { let limit: usize = cast(limit); let mut table = vec![1; (limit + 29) / 30 * 8 + 1]; let mut primes = Vec::with_capacity(32); for i in 1 .. table.len() { let n = 30 * (i >> 3) + Self::REM[i & 7]; if table[i] == 1 { table[i] = n; primes.push(n); } for &p in &primes { if n * p > limit || p > table[i] { break; } table[n * p / 30 << 3 | Self::IDX[n * p % 30]] = p; } } Self { limit, table, primes } } pub fn is_prime(&self, n: N) -> bool { let n: usize = cast(n); assert!(n <= self.limit); n == 2 || n == 3 || n == 5 || n % 2 != 0 && n % 3 != 0 && n % 5 != 0 && self.table[Self::index(n)] == n } pub fn primes(&self) -> Vec<N> { [2, 3, 5].into_iter().chain(self.primes.iter().map(|&n| cast(n) )).collect::<Vec<_>>() } pub fn least_prime_factor(&self, n: N) -> N { let n: usize = cast(n); assert!(n <= self.limit); if n % 2 == 0 { return 2; } if n % 3 == 0 { return 3; } if n % 5 == 0 { return 5; } cast(self.table[Self::index(n)]) } pub fn prime_division(&self, n: N) -> Vec<N> { let mut n: usize = cast(n); assert!(n <= self.limit); let mut divisors = vec![]; while n > 1 { let d = self.least_prime_factor(n); n /= d; divisors.push(cast(d)); } divisors } pub fn prime_division_pairs(&self, n: N) -> Vec<(N, usize)> { if n == 1 { return vec![]; } let pd = self.prime_division(n); let mut prev_p = pd[0]; let mut e = 0; let mut pairs = vec![]; for p in pd.into_iter().chain(Some(1)) { if p == prev_p { e += 1; } else { pairs.push((prev_p, e)); prev_p = p; e = 1; } } pairs } fn index(n: usize) -> usize { n / 30 << 3 | Self::IDX[n % 30] } } fn cast(n: impl Into<usize>) -> usize { n.into() } }