結果
問題 | No.2940 Sigma Sigma Div Floor Problem |
ユーザー | naut3 |
提出日時 | 2024-10-20 22:45:24 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 78 ms / 6,000 ms |
コード長 | 4,473 bytes |
コンパイル時間 | 11,733 ms |
コンパイル使用メモリ | 405,644 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-10-20 22:45:39 |
合計ジャッジ時間 | 13,820 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,820 KB |
testcase_01 | AC | 1 ms
6,816 KB |
testcase_02 | AC | 1 ms
6,820 KB |
testcase_03 | AC | 2 ms
6,816 KB |
testcase_04 | AC | 1 ms
6,816 KB |
testcase_05 | AC | 1 ms
6,820 KB |
testcase_06 | AC | 1 ms
6,820 KB |
testcase_07 | AC | 1 ms
6,816 KB |
testcase_08 | AC | 1 ms
6,820 KB |
testcase_09 | AC | 1 ms
6,820 KB |
testcase_10 | AC | 1 ms
6,820 KB |
testcase_11 | AC | 1 ms
6,816 KB |
testcase_12 | AC | 1 ms
6,820 KB |
testcase_13 | AC | 1 ms
6,816 KB |
testcase_14 | AC | 1 ms
6,816 KB |
testcase_15 | AC | 1 ms
6,816 KB |
testcase_16 | AC | 1 ms
6,816 KB |
testcase_17 | AC | 6 ms
6,820 KB |
testcase_18 | AC | 55 ms
6,816 KB |
testcase_19 | AC | 43 ms
6,816 KB |
testcase_20 | AC | 41 ms
6,820 KB |
testcase_21 | AC | 73 ms
6,816 KB |
testcase_22 | AC | 12 ms
6,820 KB |
testcase_23 | AC | 17 ms
6,820 KB |
testcase_24 | AC | 34 ms
6,820 KB |
testcase_25 | AC | 34 ms
6,820 KB |
testcase_26 | AC | 47 ms
6,816 KB |
testcase_27 | AC | 1 ms
6,816 KB |
testcase_28 | AC | 78 ms
6,820 KB |
testcase_29 | AC | 77 ms
6,816 KB |
testcase_30 | AC | 6 ms
6,816 KB |
testcase_31 | AC | 15 ms
6,820 KB |
testcase_32 | AC | 4 ms
6,816 KB |
08_evil_01.txt | RE | - |
ソースコード
#![allow(non_snake_case, unused_must_use, unused_imports)] use std::io::{self, prelude::*}; type MInt = modint::ModInt<998244353>; fn main() { let (stdin, stdout) = (io::read_to_string(io::stdin()).unwrap(), io::stdout()); let (mut stdin, mut buffer) = (stdin.split_whitespace(), io::BufWriter::new(stdout.lock())); macro_rules! input { ($t: ty, $n: expr) => { (0..$n).map(|_| input!($t)).collect::<Vec<_>>() }; ($t: ty) => { stdin.next().unwrap().parse::<$t>().unwrap() }; } let N = input!(usize); assert!(N <= 10_000_000); let mut ans = MInt::default(); for m in 1..=N { for j in 1..=N { let left = m * j; let mut right = m * j + j - 1; right = std::cmp::min(right, N); if left > N { break; } ans += m * (right - left + 1); } } writeln!(buffer, "{}", ans); } #[rustfmt::skip] pub mod modint {use std::{fmt::*, ops::*};#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default)]pub struct ModInt<const P: u32>(u32);impl<const P: u32> ModInt<P> { pub fn from_raw(value: u32) -> Self { assert!(value < P); Self(value) } pub fn pow(&self, mut x: u32) -> Self { let mut a = *self; let mut r = Self::from_raw(1); while x > 0 { if x & 1 == 1 { r *= a; } a *= a; x >>= 1; } r } pub fn inv(&self) -> Self { self.pow(P - 2) }}impl<const P: u32> Add for ModInt<P> { type Output = Self; fn add(self, rhs: Self) -> Self::Output { Self((self.0 + rhs.0) % P) }}impl<const P: u32> Sub for ModInt<P> { type Output = Self; fn sub(self, rhs: Self) -> Self::Output { Self((P + self.0 - rhs.0) % P) }}impl<const P: u32> Mul for ModInt<P> { type Output = Self; fn mul(self, rhs: Self) -> Self::Output { Self(((self.0 as u64 * rhs.0 as u64) % P as u64) as u32) }}impl<const P: u32> Div for ModInt<P> { type Output = Self; fn div(self, rhs: Self) -> Self::Output { self * rhs.inv() }}impl<const P: u32> AddAssign for ModInt<P> { fn add_assign(&mut self, rhs: Self) { self.0 += rhs.0; self.0 %= P; }}impl<const P: u32> SubAssign for ModInt<P> { fn sub_assign(&mut self, rhs: Self) { self.0 += P - rhs.0; self.0 %= P; }}impl<const P: u32> MulAssign for ModInt<P> { fn mul_assign(&mut self, rhs: Self) { *self = self.clone() * rhs; }}impl<const P: u32> DivAssign for ModInt<P> { fn div_assign(&mut self, rhs: Self) { *self *= rhs.inv() }}impl<const P: u32> Neg for ModInt<P> { type Output = Self; fn neg(self) -> Self::Output { Self((P - self.0) % P) }}impl<const P: u32> Display for ModInt<P> { fn fmt(&self, f: &mut Formatter<'_>) -> Result { write!(f, "{}", self.0) }}macro_rules! impl_op_for_modint { ($($t: ty), *) => { $( impl<const P: u32> From<$t> for ModInt<P> { fn from(value: $t) -> Self { Self((P as $t + value % P as $t) as u32 % P) } } impl<const P: u32> Add<$t> for ModInt<P> { type Output = Self; fn add(self, rhs: $t) -> Self::Output { self + Self::from(rhs) } } impl<const P: u32> Add<ModInt<P>> for $t { type Output = ModInt<P>; fn add(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) + rhs } } impl<const P: u32> Sub<$t> for ModInt<P> { type Output = Self; fn sub(self, rhs: $t) -> Self::Output { self - Self::from(rhs) } } impl<const P: u32> Sub<ModInt<P>> for $t { type Output = ModInt<P>; fn sub(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) - rhs } } impl<const P: u32> Mul<$t> for ModInt<P> { type Output = Self; fn mul(self, rhs: $t) -> Self::Output { self * Self::from(rhs) } } impl<const P: u32> Mul<ModInt<P>> for $t { type Output = ModInt<P>; fn mul(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) * rhs } } impl<const P: u32> Div<$t> for ModInt<P> { type Output = Self; fn div(self, rhs: $t) -> Self::Output { self / Self::from(rhs) } } impl<const P: u32> Div<ModInt<P>> for $t { type Output = ModInt<P>; fn div(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) / rhs } } impl<const P: u32> AddAssign<$t> for ModInt<P> { fn add_assign(&mut self, rhs: $t) { *self += Self::from(rhs) } } impl<const P: u32> SubAssign<$t> for ModInt<P> { fn sub_assign(&mut self, rhs: $t) { *self -= Self::from(rhs) } } impl<const P: u32> MulAssign<$t> for ModInt<P> { fn mul_assign(&mut self, rhs: $t) { *self *= Self::from(rhs) } } impl<const P: u32> DivAssign<$t> for ModInt<P> { fn div_assign(&mut self, rhs: $t) { *self /= Self::from(rhs) } } )* };}impl_op_for_modint!(usize, isize, u64, i64, u32, i32);}