fn main() { input! { n: usize, a: [usize; n], } // 2^iを計算 let mut ii = 1; while ii <= n { if ii == n { let ret = solve2(n, &a); println!("{}", ret); return; } ii *= 2; } if n <= 3000 { let ret = solve1(n, &a); println!("{}", ret); return; } println!("0"); } fn solve1(n: usize, a: &Vec) -> usize { let mut ret = 0; for i in 0..n { for j in 0..n { let val = mod_mul(a[i], i^j); ret = mod_add(ret, val); } } ret } fn solve2(n: usize, a: &Vec) -> usize { let mut ret = 0; for i in 0..n { let range_sum = (n-1) * n / 2; let val = mod_mul(a[i], range_sum); ret = mod_add(ret, val); } ret } const MOD : usize = 998244353; #[allow(unused)] fn mod_add(a: usize, b: usize) -> usize { let a = a % MOD; let b = b % MOD; (a + b) % MOD } #[allow(unused)] fn mod_sub(a: usize, b: usize) -> usize { let a = a % MOD; let b = b % MOD; (a + MOD - b) % MOD } #[allow(unused)] fn mod_mul(a: usize, b: usize) -> usize { let a = a % MOD; let b = b % MOD; (a * b) % MOD } #[allow(unused)] fn mod_div(a: usize, b: usize) -> usize { mod_mul(a, mod_pow(b, MOD-2)) } #[allow(unused)] fn mod_pow(mut a: usize, mut b: usize) -> usize { let mut ret = 1; while b > 0 { if b % 2 == 1 { ret = mod_mul(ret, a); } a = mod_mul(a, a); b /= 2; } ret } // const MOD93: usize = 998244353; // const MOD17: usize = 1000000007; // const INV2: usize = 499122177; // MOD93の剰余世界では、1/2の代わりにこれを掛ける // const INF: usize = 1 << 60; // const D: [(usize, usize); 4] = [(!0, 0), (0, !0), (1, 0), (0, 1)]; // 上左下右 // fn us(x: i32) -> usize { x as usize } // 文字の定義 // const CHAR_SZ: usize = 26; // const UPPER_A_ASCII : usize = 0x41; // const UPPER_Z_ASCII : usize = UPPER_A_ASCII + SZ - 1; // const LOWER_A_ASCII : usize = 0x61; // const LOWER_Z_ASCII : usize = LOWER_A_ASCII + SZ - 1; #[allow(unused)] #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone)] struct Pos { x: usize, y: usize, } #[allow(unused)] enum Direction { UP = 0, LEFT = 1, DOWN = 2, RIGHT = 3, } #[allow(unused)] #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone)] struct LoopCount { ans: usize, // 答え step: usize, // 残りステップ pos: usize, // 現在位置 cycle_len: usize, // サイクル数 cycle_add: usize, // サイクルによる増加 } #[allow(unused)] use proconio::{input, marker::Chars, marker::Usize1}; // use proconio::{input, input_interactive, marker::Chars, marker::Usize1}; #[allow(unused)] use std::{ println, print, mem::swap, cmp::min, cmp::max, cmp::Reverse, collections::HashSet, collections::BTreeSet, collections::HashMap, collections::BTreeMap, collections::BinaryHeap, collections::VecDeque, iter::FromIterator, }; #[allow(unused)] use itertools::Itertools; // #[allow(unused)] // use num::{integer::gcd, Signed}; // #[allow(unused)] // use num_integer::Roots;// 通常の平方根 // #[allow(unused)] // use superslice::Ext; // #[allow(unused)] // use rand::Rng; // let mut rng = rand::thread_rng(); // let n = rng.gen_range(1, 1000); // 連想配列のデバッグ #[allow(unused)] fn dbg_print_mp(mp: &HashMap) { for (&k, &v) in mp { println!("key:{} val:{}", k, v); } } // グリッドのデバッグ #[allow(unused)] fn dbg_print_grid(h: usize, w: usize, grid: &Vec>) { for i in 0..h { for j in 0..w { print!("{}", grid[i][j]); } println!(); } } // 最短距離のデバッグ #[allow(unused)] fn dbg_print_dist(h: usize, w: usize, dist: &Vec>) { let limit = 255; for i in 0..h { for j in 0..w { print!("{:03} ", min(dist[i][j], limit)); } println!(); } }