complete 6226.rs 7393.rs

This commit is contained in:
2026-03-16 05:02:02 +09:00
parent d8c754597f
commit f32860d61a
2 changed files with 269 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
use std::{
io::{read_to_string, stdin},
iter::zip,
};
fn get_primes(n: usize) -> Vec<usize> {
let mut primes = vec![2];
for i in (3..=n).step_by(2) {
for p in primes.iter() {
if i % p == 0 {
break;
} else if i < p * p {
primes.push(i);
break;
}
}
}
primes
}
fn legendre(n: usize, p: usize) -> usize {
let mut ppow = p;
let mut curr = n / ppow;
let mut res = curr;
while curr != 0 {
ppow = ppow * p;
curr = n / ppow;
res += curr;
}
res
}
fn prime_factorization(m: usize) -> Vec<(usize, usize)> {
let primes = get_primes(32000);
let mut curr = m;
let mut res = vec![];
for &p in primes.iter() {
let mut cnt = 0;
while curr % p == 0 {
curr /= p;
cnt += 1;
}
if cnt > 0 {
res.push((p, cnt));
}
}
if curr > 1 {
res.push((curr, 1));
}
res
}
fn combinatorics_p_cnt(n: usize, k: usize, p: usize) -> usize {
legendre(n, p) - legendre(n - k, p) - legendre(k, p)
}
fn main() {
let temp = read_to_string(stdin()).unwrap();
let mut iter = temp
.split_ascii_whitespace()
.map(|x| x.parse::<usize>().unwrap());
let (n, m) = (iter.next().unwrap(), iter.next().unwrap());
let factors = prime_factorization(m);
let mut res = vec![];
for k in 0..=(n - 1) {
let comb = factors
.iter()
.map(|&(p, _)| combinatorics_p_cnt(n - 1, k, p));
let flg = zip(comb, factors.iter()).all(|(q1, &q2)| q1 >= q2.1);
if flg {
res.push(k + 1);
}
}
println!("{}", res.len());
for i in res {
print!("{} ", i);
}
println!()
}