제출 #1323880

#제출 시각아이디문제언어결과실행 시간메모리
1323880ayhamzaiddCryptography (NOI20_crypto)C++20
100 / 100
328 ms28600 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long

const ll N=3e5+5,MOD=1e9+7;

ll ft[N],n;

void update(ll id,ll v){
    for(int i=id; i<=n; i+=i&-i)ft[i]+=v;
}

ll query(ll id){
    ll sum=0;
    for(int i=id; i>=1; i-=i&-i)sum+=ft[i];
    return sum;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int t=1;//cin>>t;
    while(t--){
        cin>>n;

        ll fac[n+5];
        fac[0]=1;
        for(ll i=1; i<=n; i++)fac[i]=(fac[i-1]*i)%MOD;

        ll a[n+5],b[n+5];
        map<ll,ll> mp;
        for(int i=1; i<=n; i++)cin>>a[i],b[i]=a[i];
        sort(a+1,a+n+1);
        for(int i=1; i<=n; i++){
            mp[a[i]]=i;
            update(i,1);
        }
        //for(int i=1; i<=n; i++)cout<<mp[b[i]]<<" ";
        ll ans=1;
        for(int i=1; i<=n; i++){
            ll c=query(mp[b[i]])-1;
            //cout<<c<<" ";
            ans=(ans+(c*fac[n-i])%MOD)%MOD;
            update(mp[b[i]],-1);
            //cout<<ans<<" ";
        }
        cout<<ans;
    }
}
#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...