complete 4674.rs 9912.rs 10826.rs 12140.rs 14452.rs 17021.rs 17386.rs 20929.rs
This commit is contained in:
115
storage/zeta/rs/completed/10826.rs
Normal file
115
storage/zeta/rs/completed/10826.rs
Normal file
@@ -0,0 +1,115 @@
|
||||
use std::fmt::{Display, Formatter, Result};
|
||||
use std::io::stdin;
|
||||
use std::ops::Add;
|
||||
|
||||
const MAX_UUINT_CNT: usize = 128;
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
struct UltraUInt {
|
||||
data: [u64; MAX_UUINT_CNT],
|
||||
}
|
||||
|
||||
impl UltraUInt {
|
||||
const fn zero() -> Self {
|
||||
UltraUInt {
|
||||
data: [0; MAX_UUINT_CNT],
|
||||
}
|
||||
}
|
||||
|
||||
const fn from_u64(val: u64) -> Self {
|
||||
let mut data = [0; MAX_UUINT_CNT];
|
||||
data[0] = val;
|
||||
UltraUInt { data }
|
||||
}
|
||||
|
||||
fn is_high_masked(&self) -> bool {
|
||||
if self.data[MAX_UUINT_CNT - 1] == u64::MAX {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
const fn high_masked() -> Self {
|
||||
let mut data = [0; MAX_UUINT_CNT];
|
||||
data[MAX_UUINT_CNT - 1] = u64::MAX;
|
||||
UltraUInt { data }
|
||||
}
|
||||
|
||||
fn div_rem_u64(&mut self, divisor: u64) -> u64 {
|
||||
let mut rem = 0u128;
|
||||
for i in (0..MAX_UUINT_CNT).rev() {
|
||||
let current = (self.data[i] as u128) + (rem << 64);
|
||||
self.data[i] = (current / divisor as u128) as u64;
|
||||
rem = current % divisor as u128;
|
||||
}
|
||||
rem as u64
|
||||
}
|
||||
|
||||
fn is_zero(&self) -> bool {
|
||||
self.data.iter().all(|&x| x == 0)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Add<&'b UltraUInt> for &'a UltraUInt {
|
||||
type Output = UltraUInt;
|
||||
fn add(self, rhs: &'b UltraUInt) -> Self::Output {
|
||||
let mut new = [0; MAX_UUINT_CNT];
|
||||
let mut carry = 0u128;
|
||||
for i in 0..MAX_UUINT_CNT {
|
||||
let s = (self.data[i] as u128) + (rhs.data[i] as u128) + carry;
|
||||
new[i] = s as u64;
|
||||
carry = s >> 64;
|
||||
}
|
||||
UltraUInt { data: new }
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for UltraUInt {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
|
||||
if self.is_zero() {
|
||||
return write!(f, "0");
|
||||
}
|
||||
|
||||
let mut temp = *self;
|
||||
let mut chunks = Vec::new();
|
||||
let base = 10_000_000_000_000_000_000u64;
|
||||
|
||||
while !temp.is_zero() {
|
||||
chunks.push(temp.div_rem_u64(base));
|
||||
}
|
||||
|
||||
if let Some(last) = chunks.pop() {
|
||||
write!(f, "{}", last)?;
|
||||
}
|
||||
|
||||
for chunk in chunks.into_iter().rev() {
|
||||
write!(f, "{:019}", chunk)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
static mut F: [UltraUInt; 10001] = {
|
||||
let mut arr: [UltraUInt; 10001] = [UltraUInt::high_masked(); 10001];
|
||||
arr[0] = UltraUInt::from_u64(0);
|
||||
arr[1] = UltraUInt::from_u64(1);
|
||||
arr
|
||||
};
|
||||
|
||||
fn fib(n: usize) -> UltraUInt {
|
||||
unsafe {
|
||||
for i in 2..=n {
|
||||
F[i] = &F[i - 1] + &F[i - 2];
|
||||
}
|
||||
F[n]
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
|
||||
let n = line.trim().parse::<usize>().unwrap();
|
||||
|
||||
println!("{}", fib(n));
|
||||
}
|
||||
107
storage/zeta/rs/completed/12140.rs
Normal file
107
storage/zeta/rs/completed/12140.rs
Normal file
@@ -0,0 +1,107 @@
|
||||
use std::io::stdin;
|
||||
|
||||
#[derive(Clone, Copy, PartialEq)]
|
||||
enum Cell {
|
||||
Up,
|
||||
Right,
|
||||
Down,
|
||||
Left,
|
||||
Period,
|
||||
}
|
||||
|
||||
fn cnt_minimum_changed_to_be_safe(r: usize, c: usize, field: &Vec<Vec<Cell>>) -> usize {
|
||||
let mut res = 0;
|
||||
|
||||
let has_target = |row: usize, col: usize, dr: i32, dc: i32| -> bool {
|
||||
let mut curr_r = row as i32 + dr;
|
||||
let mut curr_c = col as i32 + dc;
|
||||
while curr_r >= 0 && curr_r < r as i32 && curr_c >= 0 && curr_c < c as i32 {
|
||||
if field[curr_r as usize][curr_c as usize] != Cell::Period {
|
||||
return true;
|
||||
}
|
||||
curr_r += dr;
|
||||
curr_c += dc;
|
||||
}
|
||||
false
|
||||
};
|
||||
|
||||
for i in 0..r {
|
||||
for j in 0..c {
|
||||
let s = field[i][j];
|
||||
if let Cell::Period = s {
|
||||
continue;
|
||||
}
|
||||
|
||||
let (dr, dc) = match s {
|
||||
Cell::Up => (-1, 0),
|
||||
Cell::Down => (1, 0),
|
||||
Cell::Left => (0, -1),
|
||||
Cell::Right => (0, 1),
|
||||
Cell::Period => unreachable!(),
|
||||
};
|
||||
|
||||
if has_target(i, j, dr, dc) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let possible_dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)];
|
||||
let can_be_saved = possible_dirs
|
||||
.iter()
|
||||
.any(|&(ndr, ndc)| has_target(i, j, ndr, ndc));
|
||||
|
||||
if can_be_saved {
|
||||
res += 1;
|
||||
} else {
|
||||
return usize::MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let t = line.trim().parse::<usize>().unwrap();
|
||||
(1..=t).for_each(|case| {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
|
||||
let (r, c) = {
|
||||
let mut iter = line.trim().split(' ').map(|x| x.parse::<usize>().unwrap());
|
||||
(iter.next().unwrap(), iter.next().unwrap())
|
||||
};
|
||||
|
||||
let field = (0..r)
|
||||
.map(|_| {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let row = line
|
||||
.trim()
|
||||
.chars()
|
||||
.map(|c| match c {
|
||||
'.' => Cell::Period,
|
||||
'>' => Cell::Right,
|
||||
'<' => Cell::Left,
|
||||
'^' => Cell::Up,
|
||||
'v' => Cell::Down,
|
||||
_ => Cell::Period,
|
||||
})
|
||||
.collect::<Vec<Cell>>();
|
||||
row
|
||||
})
|
||||
.collect::<Vec<Vec<Cell>>>();
|
||||
|
||||
let res = cnt_minimum_changed_to_be_safe(r, c, &field);
|
||||
println!(
|
||||
"Case #{}: {}",
|
||||
case,
|
||||
if res != usize::MAX {
|
||||
res.to_string()
|
||||
} else {
|
||||
"IMPOSSIBLE".to_string()
|
||||
}
|
||||
)
|
||||
});
|
||||
}
|
||||
48
storage/zeta/rs/completed/14452.rs
Normal file
48
storage/zeta/rs/completed/14452.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
use std::{
|
||||
cmp::{max, Reverse},
|
||||
collections::BinaryHeap,
|
||||
io::{read_to_string, stdin},
|
||||
};
|
||||
|
||||
fn least_k(n: usize, durs: &Vec<usize>, tmax: usize) -> usize {
|
||||
let mut lo = 1;
|
||||
let mut hi = n;
|
||||
let mut res = n;
|
||||
while lo <= hi {
|
||||
let mid = (lo + hi) / 2;
|
||||
let mut elapsed = 0;
|
||||
|
||||
let mut heap: BinaryHeap<Reverse<usize>> = BinaryHeap::new();
|
||||
for &d in durs[0..mid].iter() {
|
||||
elapsed = max(elapsed, d);
|
||||
heap.push(Reverse(d));
|
||||
}
|
||||
|
||||
for &d in durs[mid..n].iter() {
|
||||
let finished = heap.pop().unwrap().0;
|
||||
heap.push(Reverse(finished + d));
|
||||
elapsed = max(elapsed, finished + d);
|
||||
}
|
||||
if elapsed <= tmax {
|
||||
res = mid;
|
||||
hi = mid - 1;
|
||||
} else {
|
||||
lo = mid + 1;
|
||||
}
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let temp = read_to_string(stdin()).unwrap();
|
||||
let mut iter = temp
|
||||
.split_ascii_whitespace()
|
||||
.map(|x| x.parse::<usize>().unwrap());
|
||||
|
||||
let n = iter.next().unwrap();
|
||||
let tmax = iter.next().unwrap();
|
||||
|
||||
let duration_orders: Vec<usize> = (0..n).map(|_| iter.next().unwrap()).collect();
|
||||
|
||||
println!("{}", least_k(n, &duration_orders, tmax));
|
||||
}
|
||||
169
storage/zeta/rs/completed/17021.rs
Normal file
169
storage/zeta/rs/completed/17021.rs
Normal file
@@ -0,0 +1,169 @@
|
||||
use std::io::{stdin, BufRead};
|
||||
|
||||
const R: usize = 1_000_000_007;
|
||||
|
||||
pub struct Scanner<R> {
|
||||
reader: R,
|
||||
buffer: Vec<String>,
|
||||
}
|
||||
|
||||
impl<R: BufRead> Scanner<R> {
|
||||
pub fn new(reader: R) -> Self {
|
||||
Self {
|
||||
reader,
|
||||
buffer: vec![],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn next(&mut self) -> Option<String> {
|
||||
loop {
|
||||
if let Some(token) = self.buffer.pop() {
|
||||
return Some(token);
|
||||
}
|
||||
|
||||
let mut line = String::new();
|
||||
match self.reader.read_line(&mut line) {
|
||||
Ok(0) => return None,
|
||||
Ok(_) => {
|
||||
self.buffer = line.split_whitespace().rev().map(String::from).collect();
|
||||
}
|
||||
Err(_) => return None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn next_usize(&mut self) -> Option<usize> {
|
||||
self.next()?.parse().ok()
|
||||
}
|
||||
|
||||
pub fn next_char(&mut self) -> Option<char> {
|
||||
self.next()?.chars().next()
|
||||
}
|
||||
}
|
||||
|
||||
fn get_partial_sent(
|
||||
partial_sent_count: &mut Vec<usize>,
|
||||
cnt_words_by_syllables: &Vec<usize>,
|
||||
curr: usize,
|
||||
) -> usize {
|
||||
if partial_sent_count[curr] != usize::MAX {
|
||||
partial_sent_count[curr]
|
||||
} else {
|
||||
let mut s = 0;
|
||||
|
||||
for i in 1..=curr {
|
||||
let cnt_words_at = cnt_words_by_syllables[i];
|
||||
s += cnt_words_at
|
||||
* get_partial_sent(partial_sent_count, cnt_words_by_syllables, curr - i);
|
||||
s %= R;
|
||||
}
|
||||
|
||||
partial_sent_count[curr] = s;
|
||||
|
||||
s
|
||||
}
|
||||
}
|
||||
|
||||
fn get_all_poems(
|
||||
n: usize,
|
||||
m: usize,
|
||||
k: usize,
|
||||
words: &Vec<(usize, usize)>,
|
||||
rhyme_types: &[usize; 26],
|
||||
) -> usize {
|
||||
let mut total_sent_by_cat = vec![0; n];
|
||||
let mut partial_sent_count = vec![usize::MAX; k];
|
||||
partial_sent_count[0] = 1;
|
||||
let mut cnt_words_by_syllables = vec![0; k + 1];
|
||||
|
||||
for &(s, _) in words.iter() {
|
||||
cnt_words_by_syllables[s] += 1;
|
||||
}
|
||||
|
||||
for &(s, c) in words.iter() {
|
||||
let curr = k - s;
|
||||
let s = get_partial_sent(&mut partial_sent_count, &cnt_words_by_syllables, curr);
|
||||
total_sent_by_cat[c - 1] += s;
|
||||
total_sent_by_cat[c - 1] %= R;
|
||||
}
|
||||
// Devide Powering
|
||||
let mut pow2_memo = vec![vec![usize::MAX; 20]; n];
|
||||
|
||||
for i in 0..n {
|
||||
let sent = total_sent_by_cat[i];
|
||||
if sent == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut curr = sent;
|
||||
pow2_memo[i][0] = 1;
|
||||
for j in 1..20 {
|
||||
pow2_memo[i][j] = curr;
|
||||
curr = curr * curr;
|
||||
curr %= R;
|
||||
}
|
||||
}
|
||||
|
||||
let fast_power = |idx: usize, n: usize| {
|
||||
let x = total_sent_by_cat[idx];
|
||||
if x == 0 {
|
||||
return 0;
|
||||
}
|
||||
let mut curr = n;
|
||||
let mut s = 1;
|
||||
let mut i = 1;
|
||||
while curr > 0 {
|
||||
if curr & 1 == 1 {
|
||||
s *= pow2_memo[idx][i];
|
||||
s %= R;
|
||||
}
|
||||
curr >>= 1;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
s
|
||||
};
|
||||
|
||||
// Logic
|
||||
let mut res = 1;
|
||||
for &rhyme in rhyme_types.iter() {
|
||||
if rhyme == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
let s: usize = (0..n).map(|idx| fast_power(idx, rhyme)).sum::<usize>() % R;
|
||||
|
||||
res *= s;
|
||||
res %= R;
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut scan = Scanner::new(stdin().lock());
|
||||
|
||||
let (n, m, k) = (
|
||||
scan.next_usize().unwrap(),
|
||||
scan.next_usize().unwrap(),
|
||||
scan.next_usize().unwrap(),
|
||||
);
|
||||
|
||||
let words = (0..n)
|
||||
.map(|_| (scan.next_usize().unwrap(), scan.next_usize().unwrap()))
|
||||
.collect::<Vec<(usize, usize)>>();
|
||||
|
||||
let poem_structure = (0..m)
|
||||
.map(|_| (scan.next_char().unwrap() as u8 - 'A' as u8) as usize)
|
||||
.collect::<Vec<usize>>();
|
||||
|
||||
let rhyme_types = {
|
||||
let mut rhyme_types = [0usize; 26];
|
||||
|
||||
for t in poem_structure {
|
||||
rhyme_types[t] += 1;
|
||||
}
|
||||
rhyme_types
|
||||
};
|
||||
|
||||
println!("{}", get_all_poems(n, m, k, &words, &rhyme_types))
|
||||
}
|
||||
68
storage/zeta/rs/completed/17386.rs
Normal file
68
storage/zeta/rs/completed/17386.rs
Normal file
@@ -0,0 +1,68 @@
|
||||
use std::io::{read_to_string, stdin};
|
||||
|
||||
pub struct Point {
|
||||
x: f64,
|
||||
y: f64,
|
||||
}
|
||||
|
||||
pub struct Line {
|
||||
p1: Point,
|
||||
p2: Point,
|
||||
}
|
||||
|
||||
fn ccw(p1: &Point, p2: &Point, p3: &Point) -> i32 {
|
||||
let k = (p1.y - p2.y) * (p2.x - p3.x) - (p1.x - p2.x) * (p2.y - p3.y);
|
||||
|
||||
if k > 0.0 {
|
||||
1
|
||||
} else if k < 0.0 {
|
||||
-1
|
||||
} else {
|
||||
0
|
||||
}
|
||||
}
|
||||
|
||||
fn check_intersect(l1: &Line, l2: &Line) -> bool {
|
||||
let c1 = ccw(&l1.p1, &l1.p2, &l2.p1) * ccw(&l1.p1, &l1.p2, &l2.p2);
|
||||
let c2 = ccw(&l2.p1, &l2.p2, &l1.p1) * ccw(&l2.p1, &l2.p2, &l1.p2);
|
||||
|
||||
if c1 <= 0 && c2 <= 0 {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let temp = read_to_string(stdin()).unwrap();
|
||||
let mut iter = temp
|
||||
.split_ascii_whitespace()
|
||||
.map(|x| x.parse::<f64>().unwrap());
|
||||
|
||||
let l1 = {
|
||||
Line {
|
||||
p1: Point {
|
||||
x: iter.next().unwrap(),
|
||||
y: iter.next().unwrap(),
|
||||
},
|
||||
p2: Point {
|
||||
x: iter.next().unwrap(),
|
||||
y: iter.next().unwrap(),
|
||||
},
|
||||
}
|
||||
};
|
||||
let l2 = {
|
||||
Line {
|
||||
p1: Point {
|
||||
x: iter.next().unwrap(),
|
||||
y: iter.next().unwrap(),
|
||||
},
|
||||
p2: Point {
|
||||
x: iter.next().unwrap(),
|
||||
y: iter.next().unwrap(),
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
println!("{}", check_intersect(&l1, &l2) as u8);
|
||||
}
|
||||
81
storage/zeta/rs/completed/20929.rs
Normal file
81
storage/zeta/rs/completed/20929.rs
Normal file
@@ -0,0 +1,81 @@
|
||||
use std::io::stdin;
|
||||
|
||||
struct InquireManager {
|
||||
line: String,
|
||||
}
|
||||
|
||||
impl InquireManager {
|
||||
fn new() -> Self {
|
||||
InquireManager {
|
||||
line: String::new(),
|
||||
}
|
||||
}
|
||||
|
||||
fn inquire_to_a(&mut self, x: usize) -> usize {
|
||||
println!("? A {}", x);
|
||||
self.get()
|
||||
}
|
||||
|
||||
fn inquire_to_b(&mut self, x: usize) -> usize {
|
||||
println!("? B {}", x);
|
||||
self.get()
|
||||
}
|
||||
|
||||
fn get(&mut self) -> usize {
|
||||
stdin().read_line(&mut self.line).unwrap();
|
||||
let r = self.line.trim().parse::<usize>().unwrap();
|
||||
self.line.clear();
|
||||
r
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut inq = InquireManager::new();
|
||||
let n = inq.get();
|
||||
|
||||
let res = if n <= 4 {
|
||||
let mut v = vec![];
|
||||
for i in 1..=n {
|
||||
v.push(inq.inquire_to_a(i));
|
||||
v.push(inq.inquire_to_b(i));
|
||||
}
|
||||
v.sort();
|
||||
v[n - 1]
|
||||
} else {
|
||||
let mut midpoint = 0;
|
||||
let mut lo = 1;
|
||||
let mut hi = n;
|
||||
let mut a_of = 0;
|
||||
let mut b_of = 0;
|
||||
let mut a_hi = inq.inquire_to_a(n);
|
||||
let mut b_hi = inq.inquire_to_b(n);
|
||||
while lo < hi {
|
||||
let mid = (hi + lo) / 2;
|
||||
a_of = inq.inquire_to_a(mid);
|
||||
b_of = inq.inquire_to_b(n - mid);
|
||||
if a_of == b_of {
|
||||
midpoint = a_of;
|
||||
break;
|
||||
} else if a_of > b_of {
|
||||
hi = mid;
|
||||
a_hi = a_of;
|
||||
} else {
|
||||
// a_of < b_of
|
||||
lo = mid + 1;
|
||||
b_hi = b_of;
|
||||
}
|
||||
}
|
||||
|
||||
if midpoint != 0 {
|
||||
midpoint
|
||||
} else {
|
||||
if a_hi < b_hi {
|
||||
a_hi
|
||||
} else {
|
||||
b_hi
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
println!("! {}", res);
|
||||
}
|
||||
51
storage/zeta/rs/completed/4674.rs
Normal file
51
storage/zeta/rs/completed/4674.rs
Normal file
@@ -0,0 +1,51 @@
|
||||
use std::io::stdin;
|
||||
|
||||
fn convert(text: Vec<char>) -> Vec<u64> {
|
||||
text.into_iter()
|
||||
.map(|x| match x {
|
||||
'_' => 0,
|
||||
'a'..='z' => (x as u8 - 'a' as u8 + 1) as u64,
|
||||
'.' => 27,
|
||||
_ => u64::MAX,
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn revert(code: Vec<u64>) -> Vec<char> {
|
||||
code.into_iter()
|
||||
.map(|x| match x {
|
||||
0 => '_',
|
||||
1..=26 => (b'a' + x as u8 - 1) as char,
|
||||
27 => '.',
|
||||
_ => '*',
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn decrypt(k: u64, ciphertext: Vec<char>) -> Vec<char> {
|
||||
let n = ciphertext.len();
|
||||
let ciphercode = convert(ciphertext);
|
||||
let mut plaincode = vec![0u64; n];
|
||||
|
||||
for i in 0..n {
|
||||
let j = ((k * i as u64) % n as u64) as usize;
|
||||
plaincode[j] = ((ciphercode[i] as u64 + i as u64) % 28) as u64;
|
||||
}
|
||||
revert(plaincode)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
|
||||
loop {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
if line.starts_with("0") {
|
||||
break;
|
||||
}
|
||||
let mut iter = line.split(' ');
|
||||
let k = iter.next().unwrap().trim().parse::<u64>().unwrap();
|
||||
let msg = iter.next().unwrap().trim().chars().collect();
|
||||
println!("{}", decrypt(k, msg).into_iter().collect::<String>());
|
||||
}
|
||||
}
|
||||
53
storage/zeta/rs/completed/9912.rs
Normal file
53
storage/zeta/rs/completed/9912.rs
Normal file
@@ -0,0 +1,53 @@
|
||||
use std::io::{read_to_string, stdin};
|
||||
|
||||
fn fact(x: usize) -> usize {
|
||||
static F: [usize; 16] = [
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
6,
|
||||
24,
|
||||
120,
|
||||
720,
|
||||
5040,
|
||||
40320,
|
||||
362880,
|
||||
3628800,
|
||||
39916800,
|
||||
479001600,
|
||||
6227020800,
|
||||
87178291200,
|
||||
1307674368000,
|
||||
];
|
||||
F[x]
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let temp = read_to_string(stdin()).unwrap();
|
||||
let mut iter = temp
|
||||
.split_ascii_whitespace()
|
||||
.map(|x| x.parse::<usize>().unwrap());
|
||||
|
||||
let n = iter.next().unwrap();
|
||||
let perm = (0..n).map(|_| iter.next().unwrap()).collect::<Vec<usize>>();
|
||||
|
||||
let mut vis = vec![false; n];
|
||||
|
||||
let mut res = 0;
|
||||
|
||||
for i in 0..n {
|
||||
let k = perm[i];
|
||||
let r = n - i - 1;
|
||||
let mut cnt = 0;
|
||||
for j in 0..k {
|
||||
if !vis[j] {
|
||||
cnt += 1;
|
||||
}
|
||||
}
|
||||
res += fact(r) * cnt;
|
||||
// cl
|
||||
vis[k] = true;
|
||||
}
|
||||
|
||||
println!("{}", res + 1);
|
||||
}
|
||||
Reference in New Issue
Block a user