結果
問題 | No.271 next_permutation (2) |
ユーザー |
|
提出日時 | 2025-05-24 22:00:11 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 12 ms / 2,000 ms |
コード長 | 3,752 bytes |
コンパイル時間 | 1,725 ms |
コンパイル使用メモリ | 196,020 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-05-24 22:00:14 |
合計ジャッジ時間 | 2,804 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> using namespace std; // #define LOCK_GETCHAR // #define USE_INT_128 // #undef DEBUG #ifdef DEBUG #include <moeebius/debug.hpp> #else #define debug(...) (void(0)) #define Debug(...) (void(0)) #endif #define ENABLE_IF_INT , enable_if_t<_is_integer<T>, int> = 0 template <class T> constexpr bool _is_integer = numeric_limits<T>::is_integer; template <> constexpr bool _is_integer<bool> = false; template <> constexpr bool _is_integer<char> = false; #ifdef USE_INT_128 template <> constexpr bool _is_integer<__int128> = true; template <> constexpr bool _is_integer<__uint128_t> = true; #endif #if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(LOCK_GETCHAR) #define getchar getchar_unlocked #endif #define il inline #define mkp make_pair #define fi first #define se second #define ssz(x) (signed((x).size())) #define beg2ed(x) (x).begin(), (x).end() #define _loop_i_t(j, k) make_signed_t<decltype((j) - (k))> #define For(i, j, k) for (_loop_i_t(j, k) i = (j); i <= (k); ++i) #define ForDown(i, j, k) for (_loop_i_t(j, k) i = (j); i >= decltype(i)(k); --i) #define eb emplace_back #ifndef ONLINE_JUDGE #define FileIO(filename) \ freopen(filename ".in", "r", stdin); \ freopen(filename ".out", "w", stdout) #else #define FileIO(filename) void(0) #endif using ll = long long; using uint = unsigned int; using ull = unsigned long long; using db = double; using ldb = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; #ifdef USE_INT_128 using lll = __int128_t; using ulll = __uint128_t; #endif // clang-format off constexpr il ll qpow(ll x, ull y, ll mod){ ll ans = 1; x %= mod; while (y) { if (y & 1) (ans *= x) %= mod; (x *= x) %= mod; y >>= 1; } return ans; } template<typename T> constexpr il void cmin(T & x, const T &y){ x = min(x, y); } template<typename T> constexpr il void cmax(T & x, const T &y){ x = max(x, y); } template<typename T ENABLE_IF_INT> il void read(T &x){ x = 0; int f = 1; int c = getchar(); while (!isdigit(c)) { if (c == '-') f = -1; c = getchar(); } while (isdigit(c)) { x = x * 10 + (c - '0'); c = getchar(); } x *= f; } template<typename T, typename ... Args> il void read(T &x, Args &... y){ read(x), read(y...); } // clang-format on // File head end namespace { constexpr ll MAXN = 1e5 + 5, mod = 1e9 + 7, INF = ll(1e18) + 5; int n, a[MAXN], v[MAXN], bit[MAXN]; ll K, fac[MAXN], sfac[MAXN]; void bit_add(int p, int v) { for (; p <= n; p += p & -p) bit[p] += v; } int bit_qry(int p) { int ans = 0; for (; p; p -= p & -p) ans += bit[p]; return ans; } ll calc(int st, int V, ll cnt) { if (cnt <= V - st) return (st + (st + cnt - 1)) * cnt / 2 % mod; ll ans = ll(st + V - 1) * (V - st) / 2 % mod; cnt -= V - st; ans += ll(0 + V - 1) * V / 2 % mod * (cnt / V % mod) % mod; cnt %= V; ans += ll(0 + cnt - 1) * cnt / 2 % mod; return ans % mod; } void Main() { read(n, K), K--; if (K == -1) return puts("0"), void(); For(i, 1, n) read(a[i]); fac[0] = sfac[0] = 1; For(i, 1, n) fac[i] = fac[i - 1] * i % mod; For(i, 1, 19) sfac[i] = sfac[i - 1] * i; For(i, 20, n) sfac[i] = INF; ll ans = 0, dlt = 0; For(i, 1, n) { v[i] = a[i] - bit_qry(a[i]) - 1; bit_add(a[i], 1), ans += v[i]; } ForDown(i, n, 1) { (ans += dlt % mod * v[i]) %= mod; ll pre = ans; ll c = K / sfac[n - i]; (ans += calc((v[i] + 1) % (n - i + 1), n - i + 1, c) * fac[n - i]) %= mod; (ans += (c + v[i] + 1) % (n - i + 1) * (K % sfac[n - i] % mod)) %= mod; ll temp = c < n - i - v[i] ? K : (n - i - v[i]) * sfac[n - i]; dlt += temp, K -= temp; } cout << ans << '\n'; } } // namespace signed main() { return Main(), 0; }