제출 #508859

#제출 시각아이디문제언어결과실행 시간메모리
508859tabr곤돌라 (IOI14_gondola)C++17
100 / 100
59 ms5448 KiB
#include <bits/stdc++.h> using namespace std; #ifdef tabr #include "library/debug.cpp" #else #define debug(...) #endif #include "gondola.h" template <long long mod> struct modular { long long value; modular(long long x = 0) { value = x % mod; if (value < 0) value += mod; } modular& operator+=(const modular& other) { if ((value += other.value) >= mod) value -= mod; return *this; } modular& operator-=(const modular& other) { if ((value -= other.value) < 0) value += mod; return *this; } modular& operator*=(const modular& other) { value = value * other.value % mod; return *this; } modular& operator/=(const modular& other) { long long a = 0, b = 1, c = other.value, m = mod; while (c != 0) { long long t = m / c; m -= t * c; swap(c, m); a -= t * b; swap(a, b); } a %= mod; if (a < 0) a += mod; value = value * a % mod; return *this; } friend modular operator+(const modular& lhs, const modular& rhs) { return modular(lhs) += rhs; } friend modular operator-(const modular& lhs, const modular& rhs) { return modular(lhs) -= rhs; } friend modular operator*(const modular& lhs, const modular& rhs) { return modular(lhs) *= rhs; } friend modular operator/(const modular& lhs, const modular& rhs) { return modular(lhs) /= rhs; } modular& operator++() { return *this += 1; } modular& operator--() { return *this -= 1; } modular operator++(int) { modular res(*this); *this += 1; return res; } modular operator--(int) { modular res(*this); *this -= 1; return res; } modular operator-() const { return modular(-value); } bool operator==(const modular& rhs) const { return value == rhs.value; } bool operator!=(const modular& rhs) const { return value != rhs.value; } bool operator<(const modular& rhs) const { return value < rhs.value; } }; template <long long mod> string to_string(const modular<mod>& x) { return to_string(x.value); } template <long long mod> ostream& operator<<(ostream& stream, const modular<mod>& x) { return stream << x.value; } template <long long mod> istream& operator>>(istream& stream, modular<mod>& x) { stream >> x.value; x.value %= mod; if (x.value < 0) x.value += mod; return stream; } constexpr long long mod = (long long) 1e9 + 9; using mint = modular<mod>; mint power(mint a, long long n) { mint res = 1; while (n > 0) { if (n & 1) { res *= a; } a *= a; n >>= 1; } return res; } vector<mint> fact(1, 1); vector<mint> finv(1, 1); mint C(int n, int k) { if (n < k || k < 0) { return mint(0); } while ((int) fact.size() < n + 1) { fact.emplace_back(fact.back() * (int) fact.size()); finv.emplace_back(mint(1) / fact.back()); } return fact[n] * finv[k] * finv[n - k]; } int valid(int n, int s[]) { set<int> st; for (int i = 0; i < n; i++) { if (st.count(s[i])) { return 0; } st.emplace(s[i]); } int pos = -1; for (int i = 0; i < n; i++) { if (s[i] <= n) { pos = (i - s[i] + 1 + n) % n; break; } } for (int i = 0; i < n; i++) { if (s[i] <= n) { if (pos != (i - s[i] + 1 + n) % n) { return 0; } } } return 1; } int replacement(int n, int s[], int res[]) { int pos = -1; for (int i = 0; i < n; i++) { if (s[i] <= n) { pos = (i - s[i] + 1 + n) % n; } } vector<int> order(n); iota(order.begin(), order.end(), 0); sort(order.begin(), order.end(), [&](int i, int j) { return s[i] < s[j]; }); int id = 0; int lst = n; for (int i : order) { if (s[i] <= n) { continue; } int j = (i - pos + n) % n + 1; res[id++] = j; for (int x = lst + 2; x <= s[i]; x++) { res[id++] = x - 1; } lst = s[i]; } return id; } int countReplacement(int n, int s[]) { if (!valid(n, s)) { return 0; } sort(s, s + n); mint ans = 1; int lst = n; for (int i = 0; i < n; i++) { if (s[i] <= n) { continue; } ans *= power(n - i, s[i] - lst - 1); lst = s[i]; } if (s[0] > n) { ans *= n; } return (int) ans.value; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...