Skip to content

Commit cdf0bed

Browse files
committed
feat: linear floor sum function and yosupo test
1 parent 6c49d53 commit cdf0bed

3 files changed

Lines changed: 46 additions & 9 deletions

File tree

src/alfred/all

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,34 @@
1313
#include "data_structure/dsu/cancel-dsu.hpp"
1414
#include "data_structure/dsu/dsu.hpp"
1515
#include "data_structure/dsu/weighted-dsu.hpp"
16-
#include "data_structure/dynamic-bitset.hpp"
16+
// #include "data_structure/dynamic-bitset.hpp"
1717
#include "data_structure/fenwick.hpp"
18-
#include "data_structure/hashmap.hpp"
18+
// #include "data_structure/hashmap.hpp"
1919
#include "data_structure/info.hpp"
20+
// #include "data_structure/persistent/partial-persistent-array.hpp"
2021
#include "data_structure/priority-set.hpp"
2122
#include "data_structure/sliding-window.hpp"
2223
#include "data_structure/sparse-table.hpp"
2324
#include "data_structure/sum.hpp"
2425

25-
#include "graph/graph.hpp"
26-
#include "graph/grid.hpp"
27-
#include "graph/twosat.hpp"
28-
#include "graph/hld.hpp"
29-
#include "graph/lca.hpp" // Will be included after graph class is implemented well enough
26+
// #include "graph/graph.hpp"
27+
// #include "graph/grid.hpp"
28+
// #include "graph/hld.hpp"
29+
// #include "graph/lca.hpp" // Will be included after graph class is implemented well enough
3030
#include "graph/maxflow.hpp"
31+
#include "graph/twosat.hpp"
3132

3233
#include "math/comb.hpp"
33-
#include "math/computation-geometry.hpp"
34+
// #include "math/computation-geometry.hpp"
3435
#include "math/conv.hpp"
36+
#include "math/flat-geometry.hpp" // TODO complete flat geometry
37+
#include "math/floor-sum.hpp"
38+
#include "math/gcd.hpp"
3539
#include "math/lagrange.hpp"
3640
#include "math/linear.hpp"
3741
#include "math/mod-int.hpp"
3842
#include "math/speed-of-light-power.hpp"
39-
#include "math/sqrt-decomposition.hpp"
43+
// #include "math/sqrt-decomposition.hpp"
4044
#include "math/utils.hpp"
4145

4246
#include "string/fuzz-matching.hpp"

src/alfred/math/floor-sum.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef AFMT_FLOOR_SUM
2+
#define AFMT_FLOOR_SUM
3+
4+
// Calculate $\sum_{i = 0}^{n - 1} \lfloor \frac{ai + b}{m} \rfloor$ in $O(\min\{a, m, n\})$
5+
long long floor_sum(
6+
long long a, long long b, long long m, long long n
7+
) {
8+
if (a == 0) return b / m * n;
9+
if (a >= m || b >= m) {
10+
return (a / m) * (n * (n - 1) / 2) + b / m * n +
11+
floor_sum(a % m, b % m, m, n);
12+
}
13+
long long mx = (a * (n - 1) + b) / m;
14+
return (n - 1) * mx - floor_sum(m, m - b - 1, a, mx);
15+
}
16+
17+
#endif // !AFMT_FLOOR_SUM
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/sum_of_floor_of_linear
2+
3+
#include "../../src/alfred/config/io-sync-off.hpp"
4+
#include "../../src/alfred/math/floor-sum.hpp"
5+
#include <iostream>
6+
7+
int main(int argc, char const *argv[]) {
8+
int T;
9+
optimizeIO(), std::cin >> T;
10+
while (T--) {
11+
int n, m, a, b;
12+
std::cin >> n >> m >> a >> b;
13+
std::cout << floor_sum(a, b, m, n) << '\n';
14+
}
15+
return 0;
16+
}

0 commit comments

Comments
 (0)