@@ -99,3 +99,101 @@ pub fn floor_sum(n: i64, m: i64, mut a: i64, mut b: i64) -> i64 {
99
99
ans += floor_sum ( y_max, a, m, ( a - x_max % a) % a) ;
100
100
ans
101
101
}
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