@@ -99,3 +99,101 @@ pub fn floor_sum(n: i64, m: i64, mut a: i64, mut b: i64) -> i64 {
9999 ans += floor_sum ( y_max, a, m, ( a - x_max % a) % a) ;
100100 ans
101101}
102+
103+ #[ cfg( test) ]
104+ mod tests {
105+ use super :: * ;
106+ #[ test]
107+ fn test_pow_mod ( ) {
108+ assert_eq ! ( pow_mod( 0 , 0 , 1 ) , 0 ) ;
109+ assert_eq ! ( pow_mod( 0 , 0 , 3 ) , 1 ) ;
110+ assert_eq ! ( pow_mod( 0 , 0 , 723 ) , 1 ) ;
111+ assert_eq ! ( pow_mod( 0 , 0 , 998244353 ) , 1 ) ;
112+ assert_eq ! ( pow_mod( 0 , 0 , 2u32 . pow( 31 ) ) , 1 ) ;
113+
114+ assert_eq ! ( pow_mod( 0 , 1 , 1 ) , 0 ) ;
115+ assert_eq ! ( pow_mod( 0 , 1 , 3 ) , 0 ) ;
116+ assert_eq ! ( pow_mod( 0 , 1 , 723 ) , 0 ) ;
117+ assert_eq ! ( pow_mod( 0 , 1 , 998244353 ) , 0 ) ;
118+ assert_eq ! ( pow_mod( 0 , 1 , 2u32 . pow( 31 ) ) , 0 ) ;
119+
120+ assert_eq ! ( pow_mod( 0 , i64 :: max_value( ) , 1 ) , 0 ) ;
121+ assert_eq ! ( pow_mod( 0 , i64 :: max_value( ) , 3 ) , 0 ) ;
122+ assert_eq ! ( pow_mod( 0 , i64 :: max_value( ) , 723 ) , 0 ) ;
123+ assert_eq ! ( pow_mod( 0 , i64 :: max_value( ) , 998244353 ) , 0 ) ;
124+ assert_eq ! ( pow_mod( 0 , i64 :: max_value( ) , 2u32 . pow( 31 ) ) , 0 ) ;
125+
126+ assert_eq ! ( pow_mod( 1 , 0 , 1 ) , 0 ) ;
127+ assert_eq ! ( pow_mod( 1 , 0 , 3 ) , 1 ) ;
128+ assert_eq ! ( pow_mod( 1 , 0 , 723 ) , 1 ) ;
129+ assert_eq ! ( pow_mod( 1 , 0 , 998244353 ) , 1 ) ;
130+ assert_eq ! ( pow_mod( 1 , 0 , 2u32 . pow( 31 ) ) , 1 ) ;
131+
132+ assert_eq ! ( pow_mod( 1 , 1 , 1 ) , 0 ) ;
133+ assert_eq ! ( pow_mod( 1 , 1 , 3 ) , 1 ) ;
134+ assert_eq ! ( pow_mod( 1 , 1 , 723 ) , 1 ) ;
135+ assert_eq ! ( pow_mod( 1 , 1 , 998244353 ) , 1 ) ;
136+ assert_eq ! ( pow_mod( 1 , 1 , 2u32 . pow( 31 ) ) , 1 ) ;
137+
138+ assert_eq ! ( pow_mod( 1 , i64 :: max_value( ) , 1 ) , 0 ) ;
139+ assert_eq ! ( pow_mod( 1 , i64 :: max_value( ) , 3 ) , 1 ) ;
140+ assert_eq ! ( pow_mod( 1 , i64 :: max_value( ) , 723 ) , 1 ) ;
141+ assert_eq ! ( pow_mod( 1 , i64 :: max_value( ) , 998244353 ) , 1 ) ;
142+ assert_eq ! ( pow_mod( 1 , i64 :: max_value( ) , 2u32 . pow( 31 ) ) , 1 ) ;
143+
144+ assert_eq ! ( pow_mod( i64 :: max_value( ) , 0 , 1 ) , 0 ) ;
145+ assert_eq ! ( pow_mod( i64 :: max_value( ) , 0 , 3 ) , 1 ) ;
146+ assert_eq ! ( pow_mod( i64 :: max_value( ) , 0 , 723 ) , 1 ) ;
147+ assert_eq ! ( pow_mod( i64 :: max_value( ) , 0 , 998244353 ) , 1 ) ;
148+ assert_eq ! ( pow_mod( i64 :: max_value( ) , 0 , 2u32 . pow( 31 ) ) , 1 ) ;
149+
150+ assert_eq ! ( pow_mod( i64 :: max_value( ) , i64 :: max_value( ) , 1 ) , 0 ) ;
151+ assert_eq ! ( pow_mod( i64 :: max_value( ) , i64 :: max_value( ) , 3 ) , 1 ) ;
152+ assert_eq ! ( pow_mod( i64 :: max_value( ) , i64 :: max_value( ) , 723 ) , 640 ) ;
153+ assert_eq ! (
154+ pow_mod( i64 :: max_value( ) , i64 :: max_value( ) , 998244353 ) ,
155+ 683296792
156+ ) ;
157+ assert_eq ! (
158+ pow_mod( i64 :: max_value( ) , i64 :: max_value( ) , 2u32 . pow( 31 ) ) ,
159+ 2147483647
160+ ) ;
161+
162+ assert_eq ! ( pow_mod( 2 , 3 , 1_000_000_007 ) , 8 ) ;
163+ assert_eq ! ( pow_mod( 5 , 7 , 1_000_000_007 ) , 78125 ) ;
164+ assert_eq ! ( pow_mod( 123 , 456 , 1_000_000_007 ) , 565291922 ) ;
165+ }
166+
167+ #[ test]
168+ #[ should_panic]
169+ fn test_inv_mod_1 ( ) {
170+ inv_mod ( 271828 , 0 ) ;
171+ }
172+
173+ #[ test]
174+ #[ should_panic]
175+ fn test_inv_mod_2 ( ) {
176+ inv_mod ( 3141592 , 1000000008 ) ;
177+ }
178+
179+ #[ test]
180+ fn test_crt ( ) {
181+ let a = [ 44 , 23 , 13 ] ;
182+ let b = [ 13 , 50 , 22 ] ;
183+ assert_eq ! ( crt( & a, & b) , ( 1773 , 7150 ) ) ;
184+ let a = [ 12345 , 67890 , 99999 ] ;
185+ let b = [ 13 , 444321 , 95318 ] ;
186+ assert_eq ! ( crt( & a, & b) , ( 103333581255 , 550573258014 ) ) ;
187+ }
188+
189+ #[ test]
190+ fn test_floor_sum ( ) {
191+ assert_eq ! ( floor_sum( 0 , 1 , 0 , 0 ) , 0 ) ;
192+ assert_eq ! ( floor_sum( 1_000_000_000 , 1 , 1 , 1 ) , 500_000_000_500_000_000 ) ;
193+ assert_eq ! (
194+ floor_sum( 1_000_000_000 , 1_000_000_000 , 999_999_999 , 999_999_999 ) ,
195+ 499_999_999_500_000_000
196+ ) ;
197+ assert_eq ! ( floor_sum( 332955 , 5590132 , 2231 , 999423 ) , 22014575 ) ;
198+ }
199+ }
0 commit comments