Submission #946114
Source Code Expand
#include <algorithm> #include <cassert> #include <cstring> #include <iostream> using namespace std; #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define REP(i, n) FOR(i, 0, n) #define TRACE(x) cout << #x << " = " << x << endl #define _ << " _ " << typedef long long llint; const int mod = 1e9 + 7; inline int add(int a, int b) { return a+b >= mod ? a+b-mod : a+b; } inline int sub(int a, int b) { return a >= b ? a-b : a-b+mod; } inline int mul(int a, int b) { return llint(a)*b % mod; } const int MAX = 500050; int f[MAX]; int P[MAX]; int L[MAX]; int sum(int x) { int r = 0; for (++x; x; x -= x&-x) r += L[x]; return r; } void addv(int x, int v) { for (++x; x < MAX; x += x&-x) L[x] += v; } bool ima[MAX]; int ls[MAX]; int G[MAX]; int main(void) { int N; scanf("%d", &N); REP(i, N) scanf("%d", &P[i]); f[0] = 1; REP(i, N) f[i+1] = mul(f[i], i+1); int F = 0; REP(i, N) { F += P[i] == 0; ima[P[i]] = true; } ls[0] = 0; for (int i = 1; i <= N; ++i) ls[i] = ls[i-1] + !ima[i]; int ans = f[F]; int L = 0; int gg = 0; for (int i = N-1; i >= 0; --i) { if (P[i]) { gg = add(gg, F - ls[P[i]]); } else { G[i] = gg; } } REP(i, N) { int total = 0; if (P[i]) { int FL = P[i]-1 - sum(P[i]) - ls[P[i]]; total = add(total, mul(FL, f[F])); if (F > 0) { total = add(total, mul(mul(ls[P[i]], F-L), f[F-1])); } addv(P[i], 1); } else { L++; if (F > 1) { int pairs = ((llint(F) * (F - 1)) / 2) % mod; total = add(total, mul(pairs, mul(F-L, f[F-2]))); } total = add(total, mul(G[i], f[F-1])); } ans = add(ans, mul(total, f[N-i-1])); } printf("%d\n", ans); return 0; }
Submission Info
Submission Time | |
---|---|
Task | E - Encyclopedia of Permutations |
User | ikatanic |
Language | C++14 (GCC 5.4.1) |
Score | 1200 |
Code Size | 1878 Byte |
Status | AC |
Exec Time | 95 ms |
Memory | 10624 KB |
Compile Error
./Main.cpp: In function ‘int main()’: ./Main.cpp:54:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d", &N); ^ ./Main.cpp:55:31: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result] REP(i, N) scanf("%d", &P[i]); ^
Judge Result
Set Name | Sample | Subtask | All | ||||||
---|---|---|---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 500 / 500 | 700 / 700 | ||||||
Status |
|
|
|
Set Name | Test Cases |
---|---|
Sample | 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt |
Subtask | 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt |
All | 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 2_033.txt, 2_034.txt, 2_035.txt, 2_036.txt, 2_037.txt, 2_038.txt, 2_039.txt, 2_040.txt, 2_041.txt, 2_042.txt, 2_043.txt, 2_044.txt, 2_045.txt, 2_046.txt, 2_047.txt, 2_048.txt, 2_049.txt, 2_050.txt, 2_051.txt, 2_052.txt, 2_053.txt, 2_054.txt, 2_055.txt, 2_056.txt, 2_057.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
0_000.txt | AC | 3 ms | 256 KB |
0_001.txt | AC | 3 ms | 256 KB |
0_002.txt | AC | 3 ms | 256 KB |
0_003.txt | AC | 3 ms | 256 KB |
0_004.txt | AC | 3 ms | 256 KB |
1_005.txt | AC | 3 ms | 256 KB |
1_006.txt | AC | 3 ms | 256 KB |
1_007.txt | AC | 3 ms | 256 KB |
1_008.txt | AC | 3 ms | 384 KB |
1_009.txt | AC | 3 ms | 256 KB |
1_010.txt | AC | 3 ms | 384 KB |
1_011.txt | AC | 3 ms | 384 KB |
1_012.txt | AC | 3 ms | 384 KB |
1_013.txt | AC | 3 ms | 256 KB |
1_014.txt | AC | 3 ms | 512 KB |
1_015.txt | AC | 3 ms | 256 KB |
1_016.txt | AC | 3 ms | 384 KB |
1_017.txt | AC | 3 ms | 256 KB |
1_018.txt | AC | 3 ms | 384 KB |
1_019.txt | AC | 3 ms | 256 KB |
1_020.txt | AC | 3 ms | 384 KB |
1_021.txt | AC | 3 ms | 256 KB |
1_022.txt | AC | 3 ms | 384 KB |
1_023.txt | AC | 3 ms | 384 KB |
1_024.txt | AC | 3 ms | 384 KB |
1_025.txt | AC | 3 ms | 256 KB |
1_026.txt | AC | 3 ms | 384 KB |
1_027.txt | AC | 3 ms | 256 KB |
1_028.txt | AC | 3 ms | 384 KB |
1_029.txt | AC | 3 ms | 384 KB |
1_030.txt | AC | 3 ms | 384 KB |
1_031.txt | AC | 3 ms | 384 KB |
1_032.txt | AC | 3 ms | 384 KB |
2_033.txt | AC | 54 ms | 8064 KB |
2_034.txt | AC | 28 ms | 4096 KB |
2_035.txt | AC | 65 ms | 10624 KB |
2_036.txt | AC | 59 ms | 9728 KB |
2_037.txt | AC | 71 ms | 10496 KB |
2_038.txt | AC | 62 ms | 9216 KB |
2_039.txt | AC | 77 ms | 10496 KB |
2_040.txt | AC | 39 ms | 5376 KB |
2_041.txt | AC | 82 ms | 10496 KB |
2_042.txt | AC | 17 ms | 2176 KB |
2_043.txt | AC | 86 ms | 10496 KB |
2_044.txt | AC | 56 ms | 7040 KB |
2_045.txt | AC | 89 ms | 10496 KB |
2_046.txt | AC | 85 ms | 10112 KB |
2_047.txt | AC | 91 ms | 10496 KB |
2_048.txt | AC | 40 ms | 4736 KB |
2_049.txt | AC | 95 ms | 10496 KB |
2_050.txt | AC | 62 ms | 7040 KB |
2_051.txt | AC | 90 ms | 8576 KB |
2_052.txt | AC | 82 ms | 7808 KB |
2_053.txt | AC | 54 ms | 8064 KB |
2_054.txt | AC | 95 ms | 8576 KB |
2_055.txt | AC | 77 ms | 8576 KB |
2_056.txt | AC | 78 ms | 8576 KB |
2_057.txt | AC | 69 ms | 10496 KB |