diff --git a/algorithms/graph/centroid_decomposition.cpp b/algorithms/graph/centroid_decomposition.cpp index ba4d697c0f5f088cfa22630964e1ca7a3cff0c5a..8b0bd398343370945fc84b4efb28f7349c7da4ea 100644 --- a/algorithms/graph/centroid_decomposition.cpp +++ b/algorithms/graph/centroid_decomposition.cpp @@ -18,42 +18,42 @@ vector<int> graph[MAX]; struct CentroidDecomposition { - vector<int> par, size, marked; + vector<int> par, size, vis; CentroidDecomposition(int N) : - par(N), size(N), marked(N) + par(N), size(N), vis(N) { init(); } void init() { - fill(all(marked), 0); + fill(all(vis), 0); build(0); // 0-indexed vertices } void build(int x, int p = -1) { int n = dfs(x); - int centroid = get_centroid(x, n); + int c = get_centroid(x, n); - marked[centroid] = 1; - par[centroid] = p; + vis[c] = 1; + par[c] = p; - for (auto i : graph[centroid]) - if (!marked[i]) - build(i, centroid); + for (auto i : graph[c]) + if (!vis[i]) + build(i, c); } // Calculates size of every subtree. int dfs(int x, int p = -1) { size[x] = 1; for (auto i : graph[x]) - if (i != p && !marked[i]) + if (i != p && !vis[i]) size[x] += dfs(i, x); return size[x]; } int get_centroid(int x, int n, int p = -1) { for (auto i : graph[x]) - if (i != p && size[i] > n / 2 && !marked[i]) - return get_centroid(i, x, n); + if (i != p && size[i] > n / 2 && !vis[i]) + return get_centroid(i, n, x); return x; } diff --git a/algorithms/math/binary_exponentiation.cpp b/algorithms/math/binary_exponentiation.cpp index 799941622dd72372afb300c7d8ecbc8f0a8656fd..ca57045ee532f2f2d1ad3f4589205e7f431905dc 100644 --- a/algorithms/math/binary_exponentiation.cpp +++ b/algorithms/math/binary_exponentiation.cpp @@ -3,14 +3,23 @@ /// Time: O(log n) /// Space: O(1) -template <typename T> -T bin_exp(T x, ll n) { - T ans = 1; - while (n) { - if (n & 1) - ans = ans * x; - n >>= 1; - x = x * x; +ll bin_mul(ll a, ll b, ll M = MOD) { + ll x = 0; + a %= M; + while (b) { + if (b & 1) x = (x + a) % M; + b >>= 1; + a = (a * 2) % M; } - return ans; + return x % M; +} + +ll bin_exp(ll a, ll e, ll M = MOD) { + ll x = 1; + while (e) { + if (e & 1) x = bin_mul(x, a, M); + e >>= 1; + a = bin_mul(a, a, M); + } + return x % M; } diff --git a/algorithms/math/linear_recurrence.cpp b/algorithms/math/linear_recurrence.cpp deleted file mode 100644 index ff42e83cd907321f06098aa2e21c335556ce3b02..0000000000000000000000000000000000000000 --- a/algorithms/math/linear_recurrence.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/// Linear Recurrence -/// -/// Time: O(log n) -/// Space: O(1) -/// -/// Include: -/// - math/binary_exponentiation -/// - math/matrix - -template <typename T> -matrix<T> solve(int x, int y, int n) { - matrix<T> in(2, 2); - - // Example - in[0][0] = x % MOD; - in[0][1] = y % MOD; - in[1][0] = 1; - in[1][1] = 0; - - return fast_pow<T>(in, n); -} diff --git a/algorithms/math/miller_rabin.cpp b/algorithms/math/miller_rabin.cpp new file mode 100644 index 0000000000000000000000000000000000000000..202ba136c08621ddd3d503c38e574fadebd78fa7 --- /dev/null +++ b/algorithms/math/miller_rabin.cpp @@ -0,0 +1,26 @@ +/// Miller-Rabin primality test +/// +/// Time: O(k * log^3 n) +/// Space: O(1) + +const vector<ll> A = { + 2, 325, 9375, 28178, 450775, 9780504, 1795265022 +}; + +bool is_prime(ll n) { + if (n < 2 || n % 6 % 4 != 1) + return n - 2 < 2; + + ll s = __builtin_ctzll(n - 1); + ll d = n >> s; + + for (auto a : A) { + ll p = bin_exp(a, d, n), i = s; + while (p != 1 && p != n - 1 && a % n && i--) + p = bin_mul(p, p, n); + if (p != n - 1 && i != s) + return 0; + } + + return 1; +} diff --git a/algorithms/math/pollard_rho.cpp b/algorithms/math/pollard_rho.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b520f3dd7615cb0dab1eb4b0ef8d981b6aa5e289 --- /dev/null +++ b/algorithms/math/pollard_rho.cpp @@ -0,0 +1,35 @@ +/// Pollard's Rho +/// +/// Description: +/// Returns prime factorization of $n$. +/// +/// Time: O(n^{1/4}) +/// Space: O(1) + +ll pollard(ll n) { + auto f = [n](ll x) { + return (bin_mul(x, x, n) + 1) % n; + }; + + if (n % 2 == 0) return 2; + + for (ll i = 2;; ++i) { + ll x = i, y = f(x), p; + while ((p = __gcd(n + y - x, n)) == 1) + x = f(x), y = f(f(y)); + if (p != n) return p; + } +} + +vector<ll> factor(ll n) { + if (n == 1) return {}; + if (is_prime(n)) // Use Miller-Rabin + return {n}; + + ll x = pollard(n); + auto l = factor(x); + auto r = factor(n/x); + + l.insert(l.end(), all(r)); + return l; +} diff --git a/caderno.pdf b/caderno.pdf index 675ee1f62ca6a45f7a194cdd7ef6a0ce58523902..9e2f1bbe431a7791d341b4676e517309295b6130 100644 Binary files a/caderno.pdf and b/caderno.pdf differ diff --git a/contests/Cadernaveis/a.out b/contests/Cadernaveis/a.out deleted file mode 100755 index 4768325f00306911ab20830aec41303b7e9a1c5e..0000000000000000000000000000000000000000 Binary files a/contests/Cadernaveis/a.out and /dev/null differ diff --git a/contests/Cadernaveis/in b/contests/Cadernaveis/in deleted file mode 100644 index 1f16e897b84c4216725031b8d271dea91b14b050..0000000000000000000000000000000000000000 --- a/contests/Cadernaveis/in +++ /dev/null @@ -1,10 +0,0 @@ -3 -0 0 -3 0 -0 4 -4 -0 10 -10 0 -20 10 -10 20 -0 diff --git a/contests/Cadernaveis/out b/contests/Cadernaveis/out deleted file mode 100644 index 6552e7d68b41fea92faba0e132cf10b40c394e32..0000000000000000000000000000000000000000 --- a/contests/Cadernaveis/out +++ /dev/null @@ -1,369 +0,0 @@ -Case 1: 2.40 -Case 2: 14.15 -Case 3: 0.71 -Case 4: 0.71 -Case 5: 0.71 -Case 6: 0.71 -Case 7: 0.71 -Case 8: 0.71 -Case 9: 0.01 -Case 10: 0.01 -Case 11: 0.01 -Case 12: 0.01 -Case 13: 0.01 -Case 14: 0.01 -Case 15: 10000.00 -Case 16: 26.00 -Case 17: 26.00 -Case 18: 26.00 -Case 19: 26.00 -Case 20: 26.00 -Case 21: 26.00 -Case 22: 2.00 -Case 23: 2.00 -Case 24: 2.00 -Case 25: 2.00 -Case 26: 2.00 -Case 27: 2.00 -Case 28: 26.00 -Case 29: 26.00 -Case 30: 26.00 -Case 31: 26.00 -Case 32: 26.00 -Case 33: 26.00 -Case 34: 421.90 -Case 35: 421.90 -Case 36: 421.90 -Case 37: 421.90 -Case 38: 421.90 -Case 39: 421.90 -Case 40: 313.62 -Case 41: 313.62 -Case 42: 313.62 -Case 43: 313.62 -Case 44: 313.62 -Case 45: 313.62 -Case 46: 739.83 -Case 47: 739.83 -Case 48: 739.83 -Case 49: 739.83 -Case 50: 739.83 -Case 51: 739.83 -Case 52: 939.89 -Case 53: 939.89 -Case 54: 939.89 -Case 55: 939.89 -Case 56: 939.89 -Case 57: 939.89 -Case 58: 943.66 -Case 59: 943.66 -Case 60: 943.66 -Case 61: 943.66 -Case 62: 943.66 -Case 63: 943.66 -Case 64: 965.95 -Case 65: 965.95 -Case 66: 965.95 -Case 67: 965.95 -Case 68: 965.95 -Case 69: 965.95 -Case 70: 941.45 -Case 71: 941.45 -Case 72: 941.45 -Case 73: 941.45 -Case 74: 941.45 -Case 75: 941.45 -Case 76: 827.61 -Case 77: 827.61 -Case 78: 827.61 -Case 79: 827.61 -Case 80: 827.61 -Case 81: 827.61 -Case 82: 962.07 -Case 83: 962.07 -Case 84: 962.07 -Case 85: 962.07 -Case 86: 962.07 -Case 87: 962.07 -Case 88: 522.79 -Case 89: 522.79 -Case 90: 522.79 -Case 91: 522.79 -Case 92: 522.79 -Case 93: 522.79 -Case 94: 868.59 -Case 95: 868.59 -Case 96: 868.59 -Case 97: 868.59 -Case 98: 868.59 -Case 99: 868.59 -Case 100: 943.42 -Case 101: 943.42 -Case 102: 943.42 -Case 103: 943.42 -Case 104: 943.42 -Case 105: 943.42 -Case 106: 849.02 -Case 107: 849.02 -Case 108: 849.02 -Case 109: 849.02 -Case 110: 849.02 -Case 111: 849.02 -Case 112: 872.17 -Case 113: 872.17 -Case 114: 872.17 -Case 115: 872.17 -Case 116: 872.17 -Case 117: 872.17 -Case 118: 918.82 -Case 119: 918.82 -Case 120: 918.82 -Case 121: 918.82 -Case 122: 918.82 -Case 123: 918.82 -Case 124: 830.42 -Case 125: 830.42 -Case 126: 830.42 -Case 127: 830.42 -Case 128: 830.42 -Case 129: 830.42 -Case 130: 887.99 -Case 131: 887.99 -Case 132: 887.99 -Case 133: 887.99 -Case 134: 887.99 -Case 135: 887.99 -Case 136: 819.72 -Case 137: 819.72 -Case 138: 819.72 -Case 139: 819.72 -Case 140: 819.72 -Case 141: 819.72 -Case 142: 916.86 -Case 143: 916.86 -Case 144: 916.86 -Case 145: 916.86 -Case 146: 916.86 -Case 147: 916.86 -Case 148: 894.85 -Case 149: 894.85 -Case 150: 894.85 -Case 151: 894.85 -Case 152: 894.85 -Case 153: 894.85 -Case 154: 907.85 -Case 155: 907.85 -Case 156: 907.85 -Case 157: 907.85 -Case 158: 907.85 -Case 159: 907.85 -Case 160: 897.52 -Case 161: 897.52 -Case 162: 897.52 -Case 163: 897.52 -Case 164: 897.52 -Case 165: 897.52 -Case 166: 698.88 -Case 167: 698.88 -Case 168: 698.88 -Case 169: 698.88 -Case 170: 698.88 -Case 171: 698.88 -Case 172: 520.04 -Case 173: 520.04 -Case 174: 520.04 -Case 175: 520.04 -Case 176: 520.04 -Case 177: 520.04 -Case 178: 948.53 -Case 179: 948.53 -Case 180: 948.53 -Case 181: 948.53 -Case 182: 948.53 -Case 183: 948.53 -Case 184: 890.01 -Case 185: 890.01 -Case 186: 890.01 -Case 187: 890.01 -Case 188: 890.01 -Case 189: 890.01 -Case 190: 863.93 -Case 191: 863.93 -Case 192: 863.93 -Case 193: 863.93 -Case 194: 863.93 -Case 195: 863.93 -Case 196: 902.07 -Case 197: 902.07 -Case 198: 902.07 -Case 199: 902.07 -Case 200: 902.07 -Case 201: 902.07 -Case 202: 841.60 -Case 203: 841.60 -Case 204: 841.60 -Case 205: 841.60 -Case 206: 841.60 -Case 207: 841.60 -Case 208: 887.03 -Case 209: 887.03 -Case 210: 887.03 -Case 211: 887.03 -Case 212: 887.03 -Case 213: 887.03 -Case 214: 677.03 -Case 215: 677.03 -Case 216: 677.03 -Case 217: 677.03 -Case 218: 677.03 -Case 219: 677.03 -Case 220: 917.60 -Case 221: 917.60 -Case 222: 917.60 -Case 223: 917.60 -Case 224: 917.60 -Case 225: 917.60 -Case 226: 699.30 -Case 227: 699.30 -Case 228: 699.30 -Case 229: 699.30 -Case 230: 699.30 -Case 231: 699.30 -Case 232: 781.85 -Case 233: 781.85 -Case 234: 781.85 -Case 235: 781.85 -Case 236: 781.85 -Case 237: 781.85 -Case 238: 635.53 -Case 239: 635.53 -Case 240: 635.53 -Case 241: 635.53 -Case 242: 635.53 -Case 243: 635.53 -Case 244: 846.09 -Case 245: 846.09 -Case 246: 846.09 -Case 247: 846.09 -Case 248: 846.09 -Case 249: 846.09 -Case 250: 553.25 -Case 251: 553.25 -Case 252: 553.25 -Case 253: 553.25 -Case 254: 553.25 -Case 255: 553.25 -Case 256: 971.14 -Case 257: 971.14 -Case 258: 971.14 -Case 259: 971.14 -Case 260: 971.14 -Case 261: 971.14 -Case 262: 834.71 -Case 263: 834.71 -Case 264: 834.71 -Case 265: 834.71 -Case 266: 834.71 -Case 267: 834.71 -Case 268: 857.93 -Case 269: 857.93 -Case 270: 857.93 -Case 271: 857.93 -Case 272: 857.93 -Case 273: 857.93 -Case 274: 929.54 -Case 275: 929.54 -Case 276: 929.54 -Case 277: 929.54 -Case 278: 929.54 -Case 279: 929.54 -Case 280: 882.55 -Case 281: 882.55 -Case 282: 882.55 -Case 283: 882.55 -Case 284: 882.55 -Case 285: 882.55 -Case 286: 920.93 -Case 287: 920.93 -Case 288: 920.93 -Case 289: 920.93 -Case 290: 920.93 -Case 291: 920.93 -Case 292: 885.83 -Case 293: 885.83 -Case 294: 885.83 -Case 295: 885.83 -Case 296: 885.83 -Case 297: 885.83 -Case 298: 969.79 -Case 299: 969.79 -Case 300: 969.79 -Case 301: 969.79 -Case 302: 969.79 -Case 303: 969.79 -Case 304: 935.10 -Case 305: 935.10 -Case 306: 935.10 -Case 307: 935.10 -Case 308: 935.10 -Case 309: 935.10 -Case 310: 821.22 -Case 311: 821.22 -Case 312: 821.22 -Case 313: 821.22 -Case 314: 821.22 -Case 315: 821.22 -Case 316: 936.47 -Case 317: 936.47 -Case 318: 936.47 -Case 319: 936.47 -Case 320: 936.47 -Case 321: 936.47 -Case 322: 669.83 -Case 323: 669.83 -Case 324: 669.83 -Case 325: 669.83 -Case 326: 669.83 -Case 327: 669.83 -Case 328: 937.78 -Case 329: 937.78 -Case 330: 937.78 -Case 331: 937.78 -Case 332: 937.78 -Case 333: 937.78 -Case 334: 911.71 -Case 335: 911.71 -Case 336: 911.71 -Case 337: 911.71 -Case 338: 911.71 -Case 339: 911.71 -Case 340: 878.29 -Case 341: 878.29 -Case 342: 878.29 -Case 343: 878.29 -Case 344: 878.29 -Case 345: 878.29 -Case 346: 911.88 -Case 347: 911.88 -Case 348: 911.88 -Case 349: 911.88 -Case 350: 911.88 -Case 351: 911.88 -Case 352: 819.50 -Case 353: 819.50 -Case 354: 819.50 -Case 355: 819.50 -Case 356: 819.50 -Case 357: 819.50 -Case 358: 914.16 -Case 359: 914.16 -Case 360: 914.16 -Case 361: 914.16 -Case 362: 914.16 -Case 363: 914.16 -Case 364: 525.55 -Case 365: 525.55 -Case 366: 525.55 -Case 367: 525.55 -Case 368: 525.55 -Case 369: 525.55