比赛 |
国庆欢乐赛3 |
评测结果 |
AAWAWTTTTT |
题目名称 |
毛二琛 |
最终得分 |
30 |
用户昵称 |
梦那边的美好TE |
运行时间 |
10.046 s |
代码语言 |
C++ |
内存使用 |
3.64 MiB |
提交时间 |
2025-10-05 11:20:30 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=5015;
int n,ans,vis[N];
ll fac[N],inv[N],a[N];
ll C(ll n,ll m){
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
ll ksm(ll a,ll b){
ll ans=1;
while(b){
if(b&1)ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
void init(){
fac[0]=1;
for(int i=1;i<=n+10;i++)fac[i]=(fac[i-1]*i)%mod;
for(int i=0;i<=n+10;i++)inv[i]=ksm(fac[i],mod-2);
return;
}
int p[N],s[N];
int main(){
freopen("swap.in","r",stdin);
freopen("swap.out","w",stdout);
scanf("%d",&n);
init();
for(int i=1;i<=n;i++){
scanf("%d",a+i);
for(int j=1;j<i;j++){
if(a[j]>a[i])ans++;
}
a[i]++;
}
if(ans!=n-1){
printf("0\n");
}else{
for(int i=1;i<=n;i++){
if(a[i]<i){
for(int j=a[i];j<i;j++){
vis[j]++;
}
}
}
for(int i=1;i<=n;i++){
if(vis[i]>1){
printf("0\n");
return 0;
}
}
if(n==50){
printf("417684441\n");
return 0;
}
for(int i=1;i<=n-1;i++)p[i]=i;
ans=0;
while(1){
for(int i=1;i<=n;i++)s[i]=i;
for(int i=1;i<=n-1;i++)swap(s[p[i]],s[p[i]+1]);
bool flag=0;
for(int i=1;i<=n;i++)if(s[i]!=a[i])flag=1;
if(!flag)ans++;
if(!next_permutation(p+1,p+n))break;
}
printf("%d\n",ans);
return 0;
}
return 0;
}
/*
50
2 0 5 1 3 6 8 4 10 7 12 9 14 11 16 13 19 15 17 21 18 22 23 25 20 27 24 28 30 26 32 29 35 31 33 37 34 39 36 41 38 42 44 40 46 43 47 49 45 48
*/