Submission #946383


Source Code Expand

#include <bits/stdc++.h>

using namespace std;
#define PB push_back
#define MP make_pair
#define LL long long
#define int LL
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define RE(i,n) FOR(i,1,n)
#define REP(i,n) FOR(i,0,(int)(n)-1)
#define R(i,n) REP(i,n)
#define VI vector<int>
#define PII pair<int,int>
#define LD long double
#define FI first
#define SE second
#define st FI
#define nd SE
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())

template<class C> void mini(C& _a4, C _b4) { _a4 = min(_a4, _b4); }
template<class C> void maxi(C& _a4, C _b4) { _a4 = max(_a4, _b4); }

template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<'='<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  while(*sdbg!=',')cerr<<*sdbg++;cerr<<'='<<h<<','; _dbg(sdbg+1, a...);
}

template<class T> ostream& operator<<(ostream& os, vector<T> V) {
  os << "["; for (auto& vv : V) os << vv << ","; os << "]";
  return os;
}

#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif

const int P = 1e9 + 7;
const int MAX = 1e6;
int dp[MAX];
int n;
int sum(int x){
  int res = 0;
  for(;x; x -= (x&-x)){
    res += dp[x];
  }
  return res;
}
void add(int x){
  for(;x <= n; x += (x & -x))
    dp[x] ++;
}

int p[MAX];
int zerd[MAX];
int md[MAX];
int sil[MAX];
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(11);
  cerr << fixed << setprecision(6);
  cin >> n;
  sil[0] = 1;
  R(i,n){
    sil[i+1] = sil[i] * (i+1) % P;
    cin >> p[i];
  }
  int zer = 0;
  for(int i = n-1;i>=0;i--){
    zerd[i] = zer;
    if(p[i] == 0){
      zer++;
    }else{
      md[i] = sum(p[i]);
      add(p[i]);
    }
  }
  int res = 0;
  int ss = 0;
  R(i,n){
    int pom = 0;
    if(p[i] != 0){
      pom += md[i] * sil[zer] % P;
      int wolne = p[i] - sum(p[i]);
      pom += wolne * sil[zer-1] % P * zerd[i] % P;
      res += ss * (zer - wolne) % P * sil[zer-1] % P;
    }else{
      ss += sil[n-i-1];
      ss %= P;
      pom = sil[zer] * zerd[i]% P * ((P+1) / 2) % P; ;
    }
    debug(pom);
    res += (pom % P * sil[n-i-1]) % P; 
    debug(res);
  }
  debug(res);
  res += sil[zer]; // indeksowanie ??
  cout << res % P << "\n";
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User Marcin
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 2401 Byte
Status AC
Exec Time 113 ms
Memory 19840 KB

Judge Result

Set Name Sample Subtask All
Score / Max Score 0 / 0 500 / 500 700 / 700
Status
AC × 5
AC × 33
AC × 58
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 384 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 384 KB
1_015.txt AC 3 ms 384 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 384 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 384 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 48 ms 12032 KB
2_034.txt AC 25 ms 6144 KB
2_035.txt AC 65 ms 19840 KB
2_036.txt AC 60 ms 18176 KB
2_037.txt AC 72 ms 19840 KB
2_038.txt AC 63 ms 17408 KB
2_039.txt AC 79 ms 19840 KB
2_040.txt AC 39 ms 9984 KB
2_041.txt AC 85 ms 19840 KB
2_042.txt AC 17 ms 3968 KB
2_043.txt AC 92 ms 19840 KB
2_044.txt AC 59 ms 13056 KB
2_045.txt AC 97 ms 19840 KB
2_046.txt AC 94 ms 18944 KB
2_047.txt AC 103 ms 19840 KB
2_048.txt AC 43 ms 8832 KB
2_049.txt AC 108 ms 19840 KB
2_050.txt AC 68 ms 13056 KB
2_051.txt AC 113 ms 19840 KB
2_052.txt AC 101 ms 17920 KB
2_053.txt AC 48 ms 12032 KB
2_054.txt AC 113 ms 19840 KB
2_055.txt AC 87 ms 19840 KB
2_056.txt AC 85 ms 19840 KB
2_057.txt AC 74 ms 19840 KB