init
This commit is contained in:
7
problems/p53/Cargo.toml
Normal file
7
problems/p53/Cargo.toml
Normal file
@@ -0,0 +1,7 @@
|
||||
[package]
|
||||
name = "p53"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
primal = { workspace = true }
|
||||
54
problems/p53/src/main.rs
Normal file
54
problems/p53/src/main.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
use primal::Sieve;
|
||||
use std::collections::HashMap;
|
||||
|
||||
fn comb_ge_1m(n: u64, r: u64, factor_table: &Vec<Vec<(usize, usize)>>) -> bool {
|
||||
if r == 0 || r > n {
|
||||
return false;
|
||||
}
|
||||
|
||||
let mut all_factors: HashMap<usize, i64> = HashMap::new();
|
||||
|
||||
// Use symmetry: C(n,r) = C(n,n-r), choose smaller r
|
||||
let r = r.min(n - r);
|
||||
|
||||
// 分子:(n-r+1) * (n-r+2) * ... * n
|
||||
for i in (n - r + 1)..=n {
|
||||
let factors = &factor_table[i as usize - 1];
|
||||
for (prime, exp) in factors {
|
||||
*all_factors.entry(*prime).or_insert(0) += *exp as i64;
|
||||
}
|
||||
}
|
||||
// 分母:1 * 2 * ... * r
|
||||
for i in 1..=r {
|
||||
let factors = &factor_table[i as usize - 1];
|
||||
for (prime, exp) in factors {
|
||||
*all_factors.entry(*prime).or_insert(0) -= *exp as i64;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if result >= 1M using logarithms to avoid overflow
|
||||
let mut log_result = 0.0f64;
|
||||
for (prime, exp) in all_factors {
|
||||
if exp != 0 {
|
||||
log_result += (prime as f64).ln() * (exp as f64);
|
||||
}
|
||||
}
|
||||
|
||||
log_result >= 1_000_000.0f64.ln()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut counter = 0;
|
||||
let sieve = Sieve::new(100);
|
||||
let factor_table: Vec<Vec<(usize, usize)>> =
|
||||
(1..=100).map(|x| sieve.factor(x).unwrap()).collect();
|
||||
|
||||
for n in 1..=100u64 {
|
||||
for r in 1..=n {
|
||||
if comb_ge_1m(n, r, &factor_table) {
|
||||
counter += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
println!("{counter}");
|
||||
}
|
||||
Reference in New Issue
Block a user