列表

详情


NC245314. 排队

描述

The__Flash 打游戏太投入了,把 PLMM 晾在了一边。为了弥补 PLMM,The__Flash 带着 PLMM 和小喵去看电影。

电影院人山人海,队伍排成一条长长的线,两人一喵只能乖乖排队。队伍长度为 n,个体按照队头到队尾的顺序依次编号为 1,2,...,n,其中第 i 个个体的身高为 a_i。PLMM 见状想要出题考验一下 The__Flash。

一个长度为 n 的序列 a 的逆序对个数定义为满足 的不同 (i,j) 的对数,(i_1,j_1)(i_2,j_2) 不同当且仅当

n 个个体总共有 种排队方式,记 P_i(a) 表示序列 a 的第 i 种排队方式,cnt(P_i(a)) 表示 P_i 的逆序对个数。PLMM 想知道 ,由于 The__Flash 傻乎乎的,所以请你帮他回答 PLMM 的问题。

输入描述

第一行输入一个整数 

第二行输入 n 个整数表示

输出描述

输出一个整数表示答案,由于结果可能太大,因此你只需要输出结果对  取模之后的结果。

示例1

输入:

3
1 2 3

输出:

9

示例2

输入:

7
2 4 4 3 1 1 2

输出:

45360

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 42ms, 内存消耗: 1204K, 提交时间: 2022-11-25 11:10:39

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll mod=1e9+7;

int main(){
	ll cnt[100001]={0};
	ll n,i,j,u;
	cin>>n;
	ll ans=0;
	for(i=1;i<=n;i++)
    {
		cin>>u;
		cnt[u]++;
		ans+=(i-cnt[u])%mod;
	}
	for(i=3;i<=n;i++){
		ans=ans*i%mod;
	}
	cout<<ans;
	
	
} 

C++(clang++ 11.0.1) 解法, 执行用时: 42ms, 内存消耗: 1224K, 提交时间: 2022-11-19 09:50:56

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll mod=1e9+7;

int main(){
	ll cnt[100001]={0};
	ll n,i,j,u;
	cin>>n;
	ll ans=0;
	for(i=1;i<=n;i++){
		cin>>u;
		cnt[u]++;
		ans+=(i-cnt[u])%mod;
	}
	for(i=3;i<=n;i++){
		ans=ans*i%mod;
	}
	cout<<ans;
	
	
} 

Python3 解法, 执行用时: 204ms, 内存消耗: 13600K, 提交时间: 2023-01-15 15:45:38

n=int(input())
ans=0
w=1
p=int(1e9)+7
for x in range(3,1+n):
    w=w*x%p
l=[0 for _ in range(100001)]
q=0

for x in map(int,input().split()):
    l[x]+=1

for i in range(1,   100001):
    if l[i]:
        ans+=l[i]*q
        q+=l[i]

print(ans*w%p)

pypy3 解法, 执行用时: 210ms, 内存消耗: 42212K, 提交时间: 2022-11-19 08:27:01

from collections import *
mod=10**9+7
n=int(input())
fac=1
for i in range(1,n-1):
    fac=fac*i%mod
count=Counter(input().split())
ans,tot=0,n
for a in count.values():
    tot-=a
    ans=(ans+a*tot*n*(n-1)//2*fac)%mod
print(ans)

上一题