Submission #890092

#TimeUsernameProblemLanguageResultExecution timeMemory
890092vjudge1Cryptography (NOI20_crypto)C++14
100 / 100
79 ms15216 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long

struct FenwickTree{
   int n;
   vector<int> t;
   void init(int _n){
      n=_n;
      t.assign(n+1, 0);
   }
   void update(int pos, int val){
      for (int i=pos; i<=n; i+=i&(-i)) t[i]+=val;
   }
   int get(int pos){
      int ans=0;
      for (int i=pos; i; i-=i&(-i)) ans+=t[i];
      return ans;
   }
} bit;

const int mod=1e9+7, N=3e5+1;
int n, a[N], fact[N];
pair<int, int> b[N];

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> n;
   for (int i=1; i<=n; ++i) cin >> a[i], b[i]={a[i], i};
   fact[0]=1;
   for (int i=1; i<=n; ++i) fact[i]=fact[i-1]*i%mod;
   sort(b+1, b+n+1);
   int ans=0;
   for (int i=1; i<=n; ++i) a[b[i].second]=i;
   bit.init(n);
   for (int i=1; i<=n; ++i) bit.update(i, 1);
   for (int i=1; i<=n; ++i){
      bit.update(a[i], -1);
      ans=(ans+fact[n-i]*bit.get(a[i]))%mod;
   }
   cout << (ans+1)%mod;
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...