1
0
This commit is contained in:
2026-02-04 11:15:03 +08:00
commit 8b20a5dd21
125 changed files with 4177 additions and 0 deletions

7
problems/p53/Cargo.toml Normal file
View 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
View 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}");
}