Skip to content

Commit acdfa2d

Browse files
committed
Add a test for ABC129-F
1 parent a30b072 commit acdfa2d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+206
-0
lines changed

examples/abc129-f.rs

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// https://atcoder.jp/contests/abc129/tasks/abc129_f
2+
3+
use derive_more::{Display, FromStr};
4+
use ndarray::{array, Array2, LinalgScalar};
5+
use num::{PrimInt, Unsigned};
6+
use num_derive::{One, Zero};
7+
8+
use std::cell::Cell;
9+
use std::cmp;
10+
use std::ops::{Add, Div, Mul, Sub};
11+
12+
fn main() {
13+
// use std::io::{self, Read as _};
14+
//
15+
// let mut input = "".to_owned();
16+
// io::stdin().read_to_string(&mut input).unwrap();
17+
// let mut input = input.split_whitespace();
18+
// macro_rules! read {
19+
// ([$t:tt; $n:expr]) => {
20+
// (0..$n).map(|_| read!($t)).collect::<Vec<_>>()
21+
// };
22+
// (($($t:tt),+)) => {
23+
// ($(read!($t)),*)
24+
// };
25+
// (_1based) => {
26+
// read!(usize) - 1
27+
// };
28+
// (_bytes) => {
29+
// read!(String).into_bytes()
30+
// };
31+
// ($ty:ty) => {
32+
// input.next().unwrap().parse::<$ty>().unwrap()
33+
// };
34+
// }
35+
//
36+
// let (l, a, b, m) = read!((u64, u64, u64, u64));
37+
38+
use proconio::input;
39+
40+
input! {
41+
l: u64,
42+
a: u64,
43+
b: u64,
44+
m: u64,
45+
}
46+
47+
MOD.with(|cell| cell.set(m));
48+
49+
let count = |d| -> _ {
50+
let count = |sup: u64| cmp::min(sup.saturating_sub(a + 1) / b + u64::from(b < sup), l);
51+
count(10u64.pow(d)) - count(10u64.pow(d - 1))
52+
};
53+
54+
let ans = (1..=18).fold(array![[Z(0), Z::checked(a), Z(1)]], |acc, d| {
55+
acc.dot(
56+
&array![
57+
[Z::checked(10u64.pow(d)), Z(0), Z(0)],
58+
[Z(1), Z(1), Z(0)],
59+
[Z(0), Z::checked(b), Z(1)],
60+
]
61+
.matrix_power(count(d)),
62+
)
63+
})[(0, 0)];
64+
println!("{}", ans);
65+
}
66+
67+
trait Array2Ext {
68+
fn matrix_power<E: PrimInt + Unsigned>(&self, exp: E) -> Self;
69+
}
70+
71+
impl<S: LinalgScalar> Array2Ext for Array2<S> {
72+
fn matrix_power<E: PrimInt + Unsigned>(&self, exp: E) -> Self {
73+
let (mut base, mut exp, mut acc) = (self.clone(), exp, Self::eye(self.nrows()));
74+
while exp > E::zero() {
75+
if (exp & E::one()) == E::one() {
76+
acc = acc.dot(&base);
77+
}
78+
exp = exp / (E::one() + E::one());
79+
base = base.dot(&base);
80+
}
81+
acc
82+
}
83+
}
84+
85+
thread_local! {
86+
static MOD: Cell<u64> = Cell::new(0);
87+
}
88+
89+
#[derive(Zero, One, FromStr, Display, Debug, Clone, Copy)]
90+
struct Z(u64);
91+
92+
impl Z {
93+
fn checked(mut val: u64) -> Self {
94+
let modulus = MOD.with(Cell::get);
95+
if val >= modulus {
96+
val %= modulus;
97+
}
98+
Self(val)
99+
}
100+
}
101+
102+
impl Add for Z {
103+
type Output = Self;
104+
105+
fn add(self, rhs: Self) -> Self {
106+
Self::checked(self.0 + rhs.0)
107+
}
108+
}
109+
110+
impl Sub for Z {
111+
type Output = Self;
112+
113+
fn sub(self, _: Self) -> Self {
114+
unreachable!("should not be performed")
115+
}
116+
}
117+
118+
impl Mul for Z {
119+
type Output = Self;
120+
121+
fn mul(self, rhs: Self) -> Self {
122+
Self::checked(self.0 * rhs.0)
123+
}
124+
}
125+
126+
impl Div for Z {
127+
type Output = Self;
128+
129+
fn div(self, _: Self) -> Self {
130+
unreachable!("should not be performed")
131+
}
132+
}

examples/tests.ron

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
name: "ABC120: D - Decayed Bridges",
4444
matching: ExactWords,
4545
),
46+
"abc129-f": (
47+
name: "ABC129: F - Takahashi's Basics in Education and Learning",
48+
matching: ExactWords,
49+
),
4650
"abc142-d": (
4751
name: "ABC124: D - Disjoint Set of Common Divisors",
4852
matching: ExactWords,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5 3 4 10007
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
4 8 1 1000000
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
107 10000000000007 1000000000000007 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2500000000000 4 4 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
99982444353 100 4 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
333333333333333333 3 3 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1 999999999999999999 999999999999999999 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
998244353 629149506971940504 319836804 14876851
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
999918203 4248 723308865 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
100000000000 6 231 25200
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
999999999999999999 1 1 1000000000
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
11837588 221218607 84473754642 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
81074056293 7047569542 12261087 29999997
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
999999999999999999 1 1 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
328613923524538 40980 3031 999999999
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
10914883567412 1570 62840 99999999
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1448057007031098 11 690 881005587
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
74358445905354 29310 13448 147413419
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
120900801167206 994 8061 387420489
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1380800559 8 721124722 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
105301221317 8 9457145 999999999
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
53562851 12672052437647 18553359394 99999999
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7343 44375369427231 136194167038156 841293953
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
234481 8715183188079 4262710627175 9999999
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
335 2647488178484 2976541338296614 999918169
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2508131942730888 5 397 387420489
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
151407055 44693807224027 6603923461 1000000000
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
17544042820 3 56987735 387420489
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
355391 6022223566881 25138147452 999958020
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
18 912087068546306627 3164574410046630 996674566
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
31940 139378099479290043 26943708742238 1000000000
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
345 493299812499659259 1418510335032035 998244353
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3776 494095262613235502 19199433662734 999999
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
461491 67429808854595636 2017247872269 276712227
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
147 4222724580641548 6588820255446743 982883281
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5563
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
891011
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
39122908
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
900161126
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
658481246
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
521296277
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
716070897
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
9086340
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
822961451
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
12975
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
999999999
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
739823859
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7215183
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
795127085
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
222138048
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
96844045
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
257000862
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
55813670
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
109152748
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
932512687
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
976788549
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
84300371
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
336830166
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
699837
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
184277614
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
357790932
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
878717921
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
207193062
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
336284961
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
564963471
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
997629525
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
390889114
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
792884
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
203043563
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
887967106

0 commit comments

Comments
 (0)