結果
問題 |
No.271 next_permutation (2)
|
ユーザー |
|
提出日時 | 2025-05-24 09:44:39 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,447 bytes |
コンパイル時間 | 2,083 ms |
コンパイル使用メモリ | 199,980 KB |
実行使用メモリ | 11,172 KB |
最終ジャッジ日時 | 2025-05-24 09:44:46 |
合計ジャッジ時間 | 6,326 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 5 TLE * 1 -- * 15 |
コンパイルメッセージ
main.cpp: In function ‘void solve()’: main.cpp:45:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 45 | scanf("%lld%lld", &n, &m); | ~~~~~^~~~~~~~~~~~~~~~~~~~ main.cpp:51:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 51 | scanf("%lld", &a[i]); | ~~~~~^~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mkp make_pair #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef __int128 lll; typedef double db; typedef unsigned long long ull; typedef long double ldb; typedef pair<ll, ll> pii; const int maxn = 100100; const ll mod = 1000000007; ll n, m, a[maxn], f[maxn]; lll fac[maxn]; namespace BIT { int c[maxn]; inline void update(int x, int d) { for (int i = x; i <= n; i += (i & (-i))) { c[i] += d; } } inline int query(int x) { int res = 0; for (int i = x; i; i -= (i & (-i))) { res += c[i]; } return res; } inline int query(int l, int r) { return query(r) - query(l - 1); } } void solve() { scanf("%lld%lld", &n, &m); if (n == 1) { puts("0"); return; } for (int i = 1; i <= n; ++i) { scanf("%lld", &a[i]); } fac[0] = 1; for (int i = 1;; ++i) { fac[i] = fac[i - 1] * i; if (fac[i] > 1e19) { break; } } for (int i = 1; i <= n; ++i) { BIT::update(a[i], 1); f[i] = f[i - 1] + BIT::query(a[i] + 1, n); } ll ans = f[n] % mod; BIT::update(a[n], -1); --m; while (m) { int p = n - 1; while (p && a[p] > a[p + 1]) { BIT::update(a[p--], -1); } if (!p) { if (fac[n] && m >= fac[n]) { lll t = fac[n] * n * (n - 1) / 4; ans = (ans + t % mod * ((m / fac[n]) % mod)) % mod; m %= fac[n]; } if (!m) { break; } for (int i = 1; i <= n; ++i) { a[i] = i; if (i < n) { BIT::update(a[i], 1); } f[i] = 0; } --m; continue; } int q = n; while (a[p] > a[q]) { --q; } BIT::update(a[p], -1); swap(a[p], a[q]); BIT::update(a[p], 1); f[p] = f[p - 1] + BIT::query(a[p] + 1, n); if (fac[n - p] && m >= fac[n - p]) { lll t = fac[n - p] * (n - p) * (n - p - 1) / 4; ans = (ans + t) % mod; ll s = f[p] % mod; for (int i = p + 1; i <= n; ++i) { s = (s + BIT::query(a[i] + 1, n)) % mod; } for (int i = p + 1; i < n; ++i) { BIT::update(a[i], 1); } ans = (ans + fac[n - p] % mod * s) % mod; m -= fac[n - p]; } else { reverse(a + p + 1, a + n + 1); --m; for (int i = p + 1; i <= n; ++i) { f[i] = f[i - 1] + BIT::query(a[i] + 1, n); if (i < n) { BIT::update(a[i], 1); } } ans = (ans + f[n]) % mod; } } printf("%lld\n", ans); } int main() { int T = 1; // scanf("%d", &T); while (T--) { solve(); } return 0; }