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 columnfor 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 columnfor 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 blockfor i in 1..=n - right.len() {// Just add to right columnfor 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); // Bruteassert_eq!(solve(4), 148); // Bruteassert_eq!(solve(5), 650); // Bruteassert_eq!(solve(6), 2864);assert_eq!(solve(7), 12634); // Bruteassert_eq!(solve(8), 55756); // Bruteassert_eq!(solve(9), 246098); // Bruteassert_eq!(solve(10), 1086296); // Bruteassert_eq!(solve(11), 4795090); // Bruteassert_eq!(solve(12), 21166468); // Bruteassert_eq!(solve(13), 93433178); // Bruteassert_eq!(solve(14), 412433792); // Bruteassert_eq!(solve(15), 1820570506 % MOD); // Bruteassert_eq!(solve(16), 8036386492 % MOD); // Bruteassert_eq!(solve(17), 35474325410 % MOD); // Bruteassert_eq!(solve(18), 156591247016 % MOD); // Bruteassert_eq!(solve(19), 691227204226 % MOD); // Bruteassert_eq!(solve(20), 3051224496244 % MOD); // Bruteassert_eq!(solve(21), 13468756547882 % MOD); // Bruteassert_eq!(solve(22), 59453967813584 % MOD); // Bruteassert_eq!(solve(23), 262442511046330 % MOD); // Bruteassert_eq!(solve(24), 1158477291582892 % MOD); // Bruteassert_eq!(solve(25), 5113766172173042 % MOD); // Bruteassert_eq!(solve(26), 22573255991958008 % MOD); // Bruteassert_eq!(solve(27), 99643172746536754 % MOD); // Bruteassert_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 |