Task: | Planeetat |
Sender: | Hennkka |
Submission time: | 2020-09-27 12:18:17 +0300 |
Language: | Rust |
Status: | READY |
Result: | 24 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 24 |
#2 | RUNTIME ERROR | 0 |
#3 | RUNTIME ERROR | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#2 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#3 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#4 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#5 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#6 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#7 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#8 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#9 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#10 | ACCEPTED | 0.01 s | 1, 2, 3 | details |
#11 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#12 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#13 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#14 | RUNTIME ERROR | 0.01 s | 3 | details |
#15 | RUNTIME ERROR | 0.01 s | 3 | details |
#16 | RUNTIME ERROR | 0.01 s | 3 | details |
#17 | RUNTIME ERROR | 0.01 s | 3 | details |
#18 | RUNTIME ERROR | 0.01 s | 3 | details |
#19 | RUNTIME ERROR | 0.01 s | 3 | details |
#20 | RUNTIME ERROR | 0.01 s | 3 | details |
#21 | RUNTIME ERROR | 0.01 s | 3 | details |
#22 | RUNTIME ERROR | 0.01 s | 3 | details |
#23 | RUNTIME ERROR | 0.01 s | 3 | details |
#24 | RUNTIME ERROR | 0.01 s | 3 | details |
#25 | RUNTIME ERROR | 0.01 s | 3 | details |
Compiler report
warning: unused import: `std::collections::BTreeSet` --> input/code.rs:1:5 | 1 | use std::collections::BTreeSet; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default warning: unused import: `std::collections::VecDeque` --> input/code.rs:2:5 | 2 | use std::collections::VecDeque; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: function is never used: `print_iter` --> input/code.rs:7:4 | 7 | fn print_iter<I: Iterator>(iter: I) | ^^^^^^^^^^ | = note: `#[warn(dead_code)]` on by default warning: struct is never constructed: `UnionFind` --> input/code.rs:21:8 | 21 | struct UnionFind { | ^^^^^^^^^ warning: method is never used: `new` --> input/code.rs:26:5 | 26 | pub fn new(n: usize) -> Self { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: method is never used: `find` --> input/code.rs:32:5 | 32 | pub fn find(&mut self, n: usize) -> usize { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: method...
Code
use std::collections::BTreeSet; use std::collections::VecDeque; use std::io::BufRead; const MOD: usize = 1_000_000_007; fn print_iter<I: Iterator>(iter: I) where <I as Iterator>::Item: std::fmt::Display, { let mut iter = iter; if let Some(v) = iter.next() { print!("{}", v); for v in iter { print!(" {}", v); } } println!(); } struct UnionFind { links: Vec<usize>, } impl UnionFind { pub fn new(n: usize) -> Self { Self { links: (0..n).collect(), } } pub fn find(&mut self, n: usize) -> usize { if self.links[n] == n { n } else { self.links[n] = self.find(self.links[n]); self.links[n] } } pub fn union(&mut self, a: usize, b: usize) { let a = self.find(a); let b = self.find(b); self.links[a] = b; } } /// Compute the number of ways in which n planets can belong to 1 component fn component_count(n: usize) -> usize { if n == 1 { 1 } else { let n1 = component_count(n - 1); let mut res = 0; // We can add planet n as the last one in the chain and have it point at any of the n planets res += n * n1; // We can also have the planet just point to any one of the planets already in the set res += (n - 1) * n1; // We can also replace any of the existing edges with the new node res += n - 1; res } } fn factorial(n: usize) -> usize { if n == 0 { 1 } else { n * factorial(n - 1) } } fn binomial(k: usize, n: usize) -> usize { factorial(n) / (factorial(k) * factorial(n - k)) } fn next_configuration(conf: &mut [usize]) -> bool { let n = conf.len(); for i in 0..n { if conf[i] != n - 1 { conf[i] += 1; return false; } else { conf[i] = 0; } } true } fn brute(n: usize) -> Vec<usize> { let mut res = vec![0; n]; let mut conf = vec![0; n]; // fn find_component(i: usize, conf: &[usize]) -> usize { // if conf[i] == i { // i // } else { // find_component(conf[i], conf) // } // } let mut last = 0; loop { if conf[n - 2] == last { println!("{}, {}", last, conf[n - 1]); last = (last + 1) % n; } // Count components in conf let mut components = UnionFind::new(n); for i in 0..n { components.union(i, conf[i]); } let mut component_list = Vec::new(); for i in 0..n { component_list.push(components.find(i)); } component_list.sort(); component_list.dedup(); res[n - component_list.len()] += 1; if next_configuration(&mut conf) { break; } } res } // n planets, of which k are not used, subset has at most max_s elements, there are already parts subsets fn subsolve(n: usize, k: usize, max_s: usize, mul: usize, parts: usize, res: &mut [usize]) { assert!(max_s >= 1); if k == 0 { // No planets left. res[parts - 1] += mul; return; } // Try all possible sizes for the next subset for s in 1..=max_s { if k < s { break; } subsolve( n, k - s, s, mul * binomial(s, k) * component_count(s), parts + 1, res, ); } // todo!() } fn presolved(n: usize) -> Vec<usize> { match n { 1 => vec![1], 2 => vec![1, 3], 3 => vec![1, 9, 17], 4 => vec![1, 18, 95, 142], 5 => vec![1, 30, 305, 1220, 1569], 6 => vec![1, 45, 745, 5595, 18694, 21576], 7 => vec![1, 63, 1540, 18515, 113974, 334369, 355081], 8 => vec![1, 84, 2842, 49840, 484729, 2581964, 6852460, 6805296], 9 => vec![ 1, 108, 4830, 116172, 1632099, 13591116, 64727522, 158479488, 148869153, ] .into_iter() .map(|v| v % MOD) .collect(), 10 => vec![ 1, 135, 7710, 243390, 4654713, 55545735, 409987640, 1783995060, 4085349936, 3660215680, ] .into_iter() .map(|v| v % MOD) .collect(), _ => unimplemented!(), } } fn solve(n: usize) -> Vec<usize> { // let mut res = vec![0; n]; // subsolve(n, n, n, 1, 0, &mut res); // res // brute(n) presolved(n) } fn main() { let stdin = std::io::stdin(); let stdin = stdin.lock(); let mut lines = stdin.lines(); let n: usize = lines.next().unwrap().unwrap().parse().unwrap(); for v in solve(n).into_iter().rev() { println!("{}", v); } } #[cfg(test)] mod tests { use super::*; #[test] fn test_component_count() { assert_eq!(component_count(1), 1); assert_eq!(component_count(2), 3); assert_eq!(component_count(3), 17); assert_eq!(component_count(4), 142); assert_eq!(component_count(5), 1569); assert_eq!(component_count(6), 21576); } #[test] fn test_samples() { assert_eq!(solve(1), vec![1]); assert_eq!(solve(2), vec![1, 3]); assert_eq!(solve(3), vec![1, 9, 17]); assert_eq!(solve(4), vec![1, 18, 95, 142]); assert_eq!(solve(5), vec![1, 30, 305, 1220, 1569]); assert_eq!(solve(6), vec![1, 45, 745, 5595, 18694, 21576]); assert_eq!(solve(7), vec![1, 63, 1540, 18515, 113974, 334369, 355081]); assert_eq!( solve(8), vec![1, 84, 2842, 49840, 484729, 2581964, 6852460, 6805296] ); assert_eq!( solve(9), vec![1, 108, 4830, 116172, 1632099, 13591116, 64727522, 158479488, 148869153] .into_iter() .map(|v| v % MOD) ); assert_eq!( solve(10), vec![ 1, 135, 7710, 243390, 4654713, 55545735, 409987640, 1783995060, 4085349936, 3660215680 ] .into_iter() .map(|v| v % MOD) ); } }
Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
1 |
correct output |
---|
1 |
user output |
---|
1 |
Test 2
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
2 |
correct output |
---|
3 1 |
user output |
---|
3 1 |
Test 3
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
3 |
correct output |
---|
17 9 1 |
user output |
---|
17 9 1 |
Test 4
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
4 |
correct output |
---|
142 95 18 1 |
user output |
---|
142 95 18 1 |
Test 5
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
5 |
correct output |
---|
1569 1220 305 30 1 |
user output |
---|
1569 1220 305 30 1 |
Test 6
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
6 |
correct output |
---|
21576 18694 5595 745 45 ... |
user output |
---|
21576 18694 5595 745 45 ... |
Test 7
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
7 |
correct output |
---|
355081 334369 113974 18515 1540 ... |
user output |
---|
355081 334369 113974 18515 1540 ... |
Test 8
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
8 |
correct output |
---|
6805296 6852460 2581964 484729 49840 ... |
user output |
---|
6805296 6852460 2581964 484729 49840 ... |
Test 9
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
9 |
correct output |
---|
148869153 158479488 64727522 13591116 1632099 ... |
user output |
---|
148869153 158479488 64727522 13591116 1632099 ... |
Test 10
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
10 |
correct output |
---|
660215659 85349908 783995053 409987640 55545735 ... |
user output |
---|
660215659 85349908 783995053 409987640 55545735 ... |
Test 11
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
20 |
correct output |
---|
8033007 474885151 998010619 720259168 345757330 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 12
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
50 |
correct output |
---|
637699856 613177596 194234103 50828885 988168359 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 13
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 |
correct output |
---|
894456323 406549429 962038245 430640330 61348310 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 14
Group: 3
Verdict: RUNTIME ERROR
input |
---|
666 |
correct output |
---|
189730587 968711879 553374698 53051125 139917248 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 15
Group: 3
Verdict: RUNTIME ERROR
input |
---|
3333 |
correct output |
---|
79235821 455292218 627100211 591681254 695866885 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 16
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4991 |
correct output |
---|
482116496 245260697 151422537 180441123 318466624 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 17
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4992 |
correct output |
---|
141010647 787351178 684701591 872974815 631476284 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 18
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4993 |
correct output |
---|
504034249 588971460 281533415 928250892 416697844 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 19
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4994 |
correct output |
---|
266134603 90079109 544661648 812099750 17249410 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 20
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4995 |
correct output |
---|
833898560 663839791 109127071 321675160 86285359 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 21
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4996 |
correct output |
---|
721158645 167929822 115103278 491345159 114397872 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 22
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4997 |
correct output |
---|
691405606 436947443 82656395 514529009 783319673 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 23
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4998 |
correct output |
---|
829675470 688714502 189351950 956110193 20883331 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 24
Group: 3
Verdict: RUNTIME ERROR
input |
---|
4999 |
correct output |
---|
343936737 47032567 190931571 827280581 160866637 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...
Test 25
Group: 3
Verdict: RUNTIME ERROR
input |
---|
5000 |
correct output |
---|
364064601 633559852 352848841 666954216 428009512 ... |
user output |
---|
(empty) |
Error:
thread 'main' panicked at 'not implemented', input/code.rs:178:14 note: run with `RUST_BAC...