Submission #1934291


Source Code Expand

#define _USE_MATH_DEFINES
#include <cassert>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <algorithm>
#include <complex>
#include <cmath>
#include <numeric>
#include <bitset>
#include <functional>

using namespace std;

#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
  cerr << name << ": " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << ": " << arg1 << " |";
  __f(comma + 1, args...);
}

typedef long long int64;
typedef pair<int, int> ii;
const int INF = 1 << 29;
const int MOD = 1e9 + 7;

const int N = 5e5 + 10;
int F[N], G[N];
int p[N], c[N];
bool visit[N];

int64 power_mod(int64 a, int n) {
  int64 ret = 1;
  for (; n; n >>= 1) {
    if (n & 1) ret = ret * a % MOD;
    a = a * a % MOD;
  }
  return ret;
}

int64 comb(int n, int m) {
  if (m > n || n < 0 || m < 0) return 0;
  return (int64)F[n] * G[m] % MOD * G[n - m] % MOD;
}

int64 c2(int m) {
  return (int64)m * (m - 1) / 2 % MOD;
}

void add(int x, int n) {
  for (; x <= n; x += x & -x) {
    c[x]++;
  }
}

int query(int x) {
  int ret = 0;
  for (; x; x -= x & -x) {
    ret += c[x];
  }
  return ret;
}

int main() {
  F[0] = G[0] = 1;
  for (int i = 1; i < N; ++i) {
    F[i] = (int64)F[i - 1] * i % MOD;
    G[i] = power_mod(F[i], MOD - 2);
  }
  int n, m = 0;
  vector<int> zero;
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    scanf("%d", &p[i]);
    if (p[i]) visit[p[i]] = true;
  }
  for (int i = 1; i <= n; ++i) {
    if (!visit[i]) zero.push_back(i);
  }
  m = zero.size();
  int ret = 0, cnt = 0;
  int64 sum2 = 0, cnt2 = 0;
  for (auto& it : zero) sum2 = (sum2 + it - 1) % MOD;
  // trace(sum2);
  for (int i = 0; i < n; ++i) {
    if (p[i] == 0) {
      int64 sum = (int64)(sum2 + MOD - cnt2) * F[m - 1] % MOD;
      sum = (sum + MOD -
             c2(m) * comb(m - 2, cnt - 1) % MOD *
             F[m - 1 - cnt] % MOD * F[cnt] % MOD) % MOD;
      ret += sum * F[n - 1 - i] % MOD;
      ret %= MOD;
      ++cnt;
    } else {
      int L = lower_bound(zero.begin(), zero.end(), p[i]) - zero.begin();
      int64 sum = (int64)F[m] * (p[i] - 1 - query(p[i])) % MOD;
      sum = (sum + MOD -
             (int64)L * comb(m - 1, cnt - 1) % MOD *
             F[m - cnt] % MOD * F[cnt] % MOD) % MOD;
      // trace(L, cnt, sum);
      ret += sum * F[n - 1 - i] % MOD;
      ret %= MOD;
      add(p[i], n);
      cnt2 = (cnt2 + L) % MOD;
    }
    // trace(i, ret);
  }
  ret = (ret + F[m]) % MOD;
  printf("%d\n", ret);
  return 0;
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User cuiaoxiang
Language C++14 (GCC 5.4.1)
Score 0
Code Size 2976 Byte
Status WA
Exec Time 207 ms
Memory 10352 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:87:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &n);
                  ^
./Main.cpp:89:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &p[i]);
                       ^

Judge Result

Set Name Sample Subtask All
Score / Max Score 0 / 0 0 / 500 0 / 700
Status
AC × 4
WA × 1
AC × 11
WA × 22
AC × 15
WA × 43
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 78 ms 6528 KB
0_001.txt AC 78 ms 6528 KB
0_002.txt AC 78 ms 6528 KB
0_003.txt AC 78 ms 6528 KB
0_004.txt WA 78 ms 6528 KB
1_005.txt WA 78 ms 6528 KB
1_006.txt AC 78 ms 6528 KB
1_007.txt AC 78 ms 6528 KB
1_008.txt WA 79 ms 6528 KB
1_009.txt WA 78 ms 6528 KB
1_010.txt WA 79 ms 6528 KB
1_011.txt WA 78 ms 6528 KB
1_012.txt WA 79 ms 6528 KB
1_013.txt WA 78 ms 6528 KB
1_014.txt WA 79 ms 6528 KB
1_015.txt WA 79 ms 6528 KB
1_016.txt WA 79 ms 6528 KB
1_017.txt AC 78 ms 6528 KB
1_018.txt WA 79 ms 6528 KB
1_019.txt WA 78 ms 6528 KB
1_020.txt WA 80 ms 6528 KB
1_021.txt WA 78 ms 6528 KB
1_022.txt WA 79 ms 6528 KB
1_023.txt WA 79 ms 6528 KB
1_024.txt WA 79 ms 6528 KB
1_025.txt WA 78 ms 6528 KB
1_026.txt AC 79 ms 6528 KB
1_027.txt AC 78 ms 6528 KB
1_028.txt WA 79 ms 6528 KB
1_029.txt WA 79 ms 6528 KB
1_030.txt AC 79 ms 6528 KB
1_031.txt AC 79 ms 6528 KB
1_032.txt WA 79 ms 6528 KB
2_033.txt WA 132 ms 8692 KB
2_034.txt WA 105 ms 7672 KB
2_035.txt WA 148 ms 10352 KB
2_036.txt WA 142 ms 10224 KB
2_037.txt WA 161 ms 10224 KB
2_038.txt WA 150 ms 9968 KB
2_039.txt WA 173 ms 9968 KB
2_040.txt WA 123 ms 8564 KB
2_041.txt WA 184 ms 9712 KB
2_042.txt WA 96 ms 7292 KB
2_043.txt WA 193 ms 9588 KB
2_044.txt WA 151 ms 8820 KB
2_045.txt WA 199 ms 9332 KB
2_046.txt WA 194 ms 9332 KB
2_047.txt WA 204 ms 9080 KB
2_048.txt WA 130 ms 7932 KB
2_049.txt WA 207 ms 8828 KB
2_050.txt WA 160 ms 8316 KB
2_051.txt AC 160 ms 8576 KB
2_052.txt AC 153 ms 8448 KB
2_053.txt WA 132 ms 8692 KB
2_054.txt WA 170 ms 8576 KB
2_055.txt AC 147 ms 8576 KB
2_056.txt AC 147 ms 8576 KB
2_057.txt WA 156 ms 9588 KB