Task: | Torni |
Sender: | Hennkka |
Submission time: | 2020-09-26 13:30:06 +0300 |
Language: | Rust |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 15 |
#2 | ACCEPTED | 41 |
#3 | ACCEPTED | 44 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.03 s | 1, 2, 3 | details |
#2 | ACCEPTED | 0.03 s | 2, 3 | details |
#3 | ACCEPTED | 0.03 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: `solve` --> input/code.rs:41:4 | 41 | fn solve(n: usize) -> usize { | ^^^^^ | = note: `#[warn(dead_code)]` on by default warning: function is never used: `brute` --> input/code.rs:52:4 | 52 | fn brute(n: usize) -> usize { | ^^^^^
Code
use std::collections::BTreeSet; use std::collections::VecDeque; use std::io::BufRead; const MOD: usize = 1_000_000_007; struct Solver { result: Vec<usize>, } impl Solver { pub fn new(max_n: usize) -> Self { let mut solid: Vec<usize> = Vec::with_capacity(max_n); let mut split: Vec<usize> = Vec::with_capacity(max_n); let mut result: Vec<usize> = Vec::with_capacity(max_n); let mut result_sum: usize = 0; solid.push(1); split.push(1); result.push(2); result_sum += 2; for _ in 1..max_n { let last_solid = *solid.last().unwrap(); let last_split = *split.last().unwrap(); split.push((4 * last_split + last_solid) % MOD); solid.push((1 + result_sum) % MOD); result.push((solid.last().unwrap() + split.last().unwrap()) % MOD); result_sum = (result_sum + result.last().unwrap()) % MOD; } Self { result } } pub fn res(&self, n: usize) -> usize { self.result[n - 1] } } fn solve(n: usize) -> usize { Solver::new(n).res(n) } #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] struct Block { sideways: bool, up: bool, down: bool, } fn brute(n: usize) -> usize { fn construct_until( left: &mut Vec<Block>, right: &mut Vec<Block>, all: &mut Vec<(Vec<Block>, Vec<Block>)>, n: usize, ) { if left.len() == n && right.len() == n { all.push((left.clone(), right.clone())); return; } if left.len() < n { for i in 1..=n - left.len() { // Just add to left column for j in 0..i { left.push(Block { sideways: false, up: j != i - 1, down: j > 0, }); } construct_until(left, right, all, n); for _ in 0..i { left.pop(); } } } if right.len() < n { for i in 1..=n - right.len() { // Just add to right column for j in 0..i { right.push(Block { sideways: false, up: j != i - 1, down: j > 0, }); } construct_until(left, right, all, n); for _ in 0..i { right.pop(); } } } if left.len() == right.len() && left.len() < n { // Add a double-wide block for i in 1..=n - right.len() { // Just add to right column for j in 0..i { left.push(Block { sideways: true, up: j != i - 1, down: j > 0, }); right.push(Block { sideways: true, up: j != i - 1, down: j > 0, }); } construct_until(left, right, all, n); for _ in 0..i { left.pop(); right.pop(); } } } } let mut all = Vec::new(); construct_until(&mut vec![], &mut vec![], &mut all, n); all.sort(); all.dedup(); // println!("{:?}",all); all.len() } fn main() { let solver = Solver::new(1_000_000); let stdin = std::io::stdin(); let stdin = stdin.lock(); let mut lines = stdin.lines(); let t: usize = lines.next().unwrap().unwrap().parse().unwrap(); for _ in 0..t { let n: usize = lines.next().unwrap().unwrap().parse().unwrap(); println!("{}", solver.res(n)); } } #[cfg(test)] mod tests { use super::*; #[test] fn test_samples() { assert_eq!(solve(1), 2); assert_eq!(solve(2), 8); assert_eq!(solve(3), 34); // Brute assert_eq!(solve(4), 148); // Brute assert_eq!(solve(5), 650); // Brute assert_eq!(solve(6), 2864); assert_eq!(solve(7), 12634); // Brute assert_eq!(solve(8), 55756); // Brute assert_eq!(solve(9), 246098); // Brute assert_eq!(solve(10), 1086296); // Brute assert_eq!(solve(11), 4795090); // Brute assert_eq!(solve(12), 21166468); // Brute assert_eq!(solve(13), 93433178); // Brute assert_eq!(solve(14), 412433792); // Brute assert_eq!(solve(15), 1820570506 % MOD); // Brute assert_eq!(solve(16), 8036386492 % MOD); // Brute assert_eq!(solve(17), 35474325410 % MOD); // Brute assert_eq!(solve(18), 156591247016 % MOD); // Brute assert_eq!(solve(19), 691227204226 % MOD); // Brute assert_eq!(solve(20), 3051224496244 % MOD); // Brute assert_eq!(solve(21), 13468756547882 % MOD); // Brute assert_eq!(solve(22), 59453967813584 % MOD); // Brute assert_eq!(solve(23), 262442511046330 % MOD); // Brute assert_eq!(solve(24), 1158477291582892 % MOD); // Brute assert_eq!(solve(25), 5113766172173042 % MOD); // Brute assert_eq!(solve(26), 22573255991958008 % MOD); // Brute assert_eq!(solve(27), 99643172746536754 % MOD); // Brute assert_eq!(solve(1337), 640403945); } }
Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
input |
---|
10 1 2 3 4 ... |
correct output |
---|
2 8 34 148 650 ... |
user output |
---|
2 8 34 148 650 ... |
Test 2
Group: 2, 3
Verdict: ACCEPTED
input |
---|
100 1 2 3 4 ... |
correct output |
---|
2 8 34 148 650 ... |
user output |
---|
2 8 34 148 650 ... Truncated |
Test 3
Group: 3
Verdict: ACCEPTED
input |
---|
100 996306 650655 896240 821967 ... |
correct output |
---|
87350005 606189151 122595036 193572715 227926807 ... |
user output |
---|
87350005 606189151 122595036 193572715 227926807 ... Truncated |