結果
問題 | No.1193 Penguin Sequence |
ユーザー | Shibuyap |
提出日時 | 2020-08-22 19:10:23 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,561 bytes |
コンパイル時間 | 2,301 ms |
コンパイル使用メモリ | 211,484 KB |
実行使用メモリ | 28,692 KB |
最終ジャッジ日時 | 2024-10-15 12:13:00 |
合計ジャッジ時間 | 10,078 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | AC | 133 ms
22,648 KB |
testcase_12 | AC | 133 ms
22,788 KB |
testcase_13 | AC | 196 ms
26,484 KB |
testcase_14 | AC | 184 ms
25,772 KB |
testcase_15 | WA | - |
testcase_16 | AC | 127 ms
17,576 KB |
testcase_17 | AC | 18 ms
15,360 KB |
testcase_18 | AC | 33 ms
16,512 KB |
testcase_19 | AC | 224 ms
28,288 KB |
testcase_20 | AC | 178 ms
25,476 KB |
testcase_21 | AC | 144 ms
23,504 KB |
testcase_22 | AC | 36 ms
16,768 KB |
testcase_23 | AC | 123 ms
22,192 KB |
testcase_24 | AC | 108 ms
21,192 KB |
testcase_25 | AC | 58 ms
18,048 KB |
testcase_26 | AC | 26 ms
16,128 KB |
testcase_27 | AC | 191 ms
26,328 KB |
testcase_28 | AC | 134 ms
22,932 KB |
testcase_29 | WA | - |
testcase_30 | AC | 75 ms
19,200 KB |
testcase_31 | AC | 64 ms
18,688 KB |
testcase_32 | AC | 157 ms
24,092 KB |
testcase_33 | AC | 112 ms
21,476 KB |
testcase_34 | AC | 95 ms
20,316 KB |
testcase_35 | AC | 113 ms
21,744 KB |
testcase_36 | AC | 92 ms
20,168 KB |
testcase_37 | AC | 187 ms
26,044 KB |
testcase_38 | AC | 18 ms
15,360 KB |
testcase_39 | AC | 18 ms
15,616 KB |
testcase_40 | AC | 18 ms
15,360 KB |
ソースコード
#include <bits/stdc++.h> #define rep(i,n) for(ll i = 0; i < (n); ++i) #define drep(i,n) for(ll i = (n)-1; i >= 0; --i) #define srep(i,s,t) for (ll i = s; i < t; ++i) using namespace std; typedef long long int ll; typedef pair<int,int> P; #define yn {puts("Yes");}else{puts("No");} ll mergecount(vector<int> &a) { ll count = 0; int n = a.size(); if (n > 1) { vector<int> b(a.begin(), a.begin() + n/2); vector<int> c(a.begin() + n/2, a.end()); count += mergecount(b); count += mergecount(c); for (int i = 0, j = 0, k = 0; i < n; ++i) if (k == c.size()) a[i] = b[j++]; else if (j == b.size()) a[i] = c[k++]; else if (b[j] <= c[k]) a[i] = b[j++]; else { a[i] = c[k++]; count += n/2 - j; } } return count; } const int MAX = 510000; const int MOD = 998244353; long long fac[MAX], finv[MAX], inv[MAX]; // テーブルを作る前処理 void COMinit() { fac[0] = fac[1] = 1; finv[0] = finv[1] = 1; inv[1] = 1; for (int i = 2; i < MAX; i++){ fac[i] = fac[i - 1] * i % MOD; inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD; finv[i] = finv[i - 1] * inv[i] % MOD; } } // 二項係数計算 long long COM(int n, int k){ if (n < k) return 0; if (n < 0 || k < 0) return 0; return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD; } long long FINV(int n){ if (n < 0) return 0; return finv[n]; } // ax + by = gcd(a, b) となるような (x, y) を求める // a と b は互いに素として ax + by = 1 となる (x, y) を求める long long extGCD(long long a, long long b, long long &x, long long &y) { if (b == 0) { x = 1; y = 0; return a; } long long d = extGCD(b, a%b, y, x); // 再帰 y -= a / b * x; return d; } // 負の数に対応した mod inline long long mod(long long a, long long m) { return (a % m + m) % m; } // 逆元計算 (a と m が互いに素であることが必要) long long modinv(long long a, long long m) { long long x, y; extGCD(a, m, x, y); return mod(x, m); // x % m だが、x が負かもしれないので } int main() { COMinit(); ll n; cin >> n; vector<int> a(n); rep(i,n) cin >> a[i]; ll ten = mergecount(a); ten %= MOD; map<int,ll> mp; rep(i,n)mp[a[i]]++; ll diff = 0; rep(i,n){ diff += (n-mp[a[i]]); } diff /= 2; // cout << "diff = " << diff << endl; ll mul = 1; srep(i,1,n+1){ mul *= COM(n,i); mul %= MOD; } ll all = mul; ll sum2 = 0; srep(i,1,n+1){ sum2 += (ll)i * (((n*(n+1)/2) - i*(i+1)/2)%MOD) % MOD; sum2 %= MOD; } all = all * sum2 % MOD; // all *= (n*(n+1)%MOD*((n*(n+1)-2)%MOD)%MOD*modinv(8,MOD)%MOD)%MOD; // cout << all << endl; ll mine = mul * modinv(n*n,MOD) % MOD; ll sum = 0; srep(i,1,n+1){ ll tmp = n*(n+1)/2 - i*(i+1)/2; sum += tmp; sum %= MOD; } mine = mine * sum % MOD * n % MOD; // cout << mine << endl; // ll ans1 = (all + MOD - mine) % MOD * diff % MOD * modinv(n*(n-1),MOD) % MOD; ll ans1 = all % MOD * diff % MOD * modinv(n*n,MOD) % MOD; ll sum3 = 0; ll mine2 = mul * modinv(n*(n-1),MOD) % MOD; srep(i,2,n+1){ sum3 += i * (i - 1); sum3 %= MOD; } mine2 = mine2 * sum3 % MOD; ll ans2 = mine2 * ten % MOD; ll ans = (ans1 + ans2) % MOD; // cout << ans1 << ' ' << ans2 << endl; cout << ans << endl; return 0; }