NC245314. 排队
描述
输入描述
第一行输入一个整数 。
第二行输入 个整数表示 。
输出描述
输出一个整数表示答案,由于结果可能太大,因此你只需要输出结果对 取模之后的结果。
示例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)