Submission #946030


Source Code Expand

#include<stdio.h>
#include<algorithm>
using namespace std;
long long mod=1000000007;
int M=510000;
long long inv[510000];
long long fact[510000];
long long factinv[510000];
int b[510000];
int at[510000];
int v[510000];
pair<int,int> p[510000];
int bit[510000];
int sum(int a,int b){
	if(a)return sum(0,b)-sum(0,a-1);
	int ret=0;
	for(;b>=0;b=(b&(b+1))-1)ret+=bit[b];
	return ret;
}
void add(int a,int b){
	for(;a<510000;a|=a+1)bit[a]+=b;
}
int main(){
	inv[1]=fact[0]=factinv[0]=1;
	for(int i=2;i<M;i++)inv[i]=(mod-(mod/i)*inv[mod%i]%mod)%mod;
	for(int i=1;i<M;i++)fact[i]=fact[i-1]*i%mod;
	for(int i=1;i<M;i++)factinv[i]=factinv[i-1]*inv[i]%mod;
	int a;scanf("%d",&a);
	int ind=0;
	for(int i=0;i<a;i++){
		scanf("%d",b+i);
		b[i]--;
		v[b[i]]++;
		if(b[i]>=0){
			p[ind++]=make_pair(b[i],i);
		}
	}
	int sz=0;
	for(int i=0;i<a;i++)if(!v[i])at[sz++]=i;
	long long ret=0;
	int cnt=0;
	long long ad=0;
	long long hu=0;
	long long ks=1;
	int ps=0;
	for(int i=0;i<a;i++)if(b[i]==-1)ps++;
	for(int i=a-1;i>=0;i--){
		
		if(b[i]==-1){
			cnt++;
			ret=(ret+(long long)(cnt)*(cnt-1)/2%mod*inv[cnt]%mod*fact[ps]%mod*ks)%mod;
			ret=(ret+ad%mod*inv[sz]%mod*ks%mod*fact[ps])%mod;
		}else{
			int ts=sum(0,b[i]);
			hu=(hu+(long long)ts*ks%mod)%mod;
			int tmp=lower_bound(at,at+sz,b[i])-at;
			hu=(hu+(long long)tmp*cnt%mod*inv[sz]%mod*ks)%mod;
			add(b[i],1);
			ad+=sz-tmp;
		}
	//	printf("%lld\n",ret);
		ks=ks*(a-i)%mod;
	}
	//printf("%lld\n",ret);
	ret=(ret+fact[cnt])%mod;
	ret=(ret+hu%mod*fact[cnt])%mod;
	printf("%lld\n",ret);
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User tozangezan
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 1593 Byte
Status AC
Exec Time 293 ms
Memory 21888 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:28:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  int a;scanf("%d",&a);
                      ^
./Main.cpp:31:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",b+i);
                  ^

Judge Result

Set Name Sample Subtask All
Score / Max Score 0 / 0 500 / 500 700 / 700
Status
AC × 5
AC × 33
AC × 58
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt
Subtask 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 2_033.txt, 2_034.txt, 2_035.txt, 2_036.txt, 2_037.txt, 2_038.txt, 2_039.txt, 2_040.txt, 2_041.txt, 2_042.txt, 2_043.txt, 2_044.txt, 2_045.txt, 2_046.txt, 2_047.txt, 2_048.txt, 2_049.txt, 2_050.txt, 2_051.txt, 2_052.txt, 2_053.txt, 2_054.txt, 2_055.txt, 2_056.txt, 2_057.txt
Case Name Status Exec Time Memory
0_000.txt AC 69 ms 12160 KB
0_001.txt AC 68 ms 12160 KB
0_002.txt AC 68 ms 12160 KB
0_003.txt AC 68 ms 12160 KB
0_004.txt AC 68 ms 12160 KB
1_005.txt AC 67 ms 12160 KB
1_006.txt AC 68 ms 12160 KB
1_007.txt AC 70 ms 12160 KB
1_008.txt AC 68 ms 12160 KB
1_009.txt AC 68 ms 12160 KB
1_010.txt AC 68 ms 12160 KB
1_011.txt AC 68 ms 12160 KB
1_012.txt AC 68 ms 12160 KB
1_013.txt AC 68 ms 12160 KB
1_014.txt AC 68 ms 12160 KB
1_015.txt AC 68 ms 12160 KB
1_016.txt AC 68 ms 12288 KB
1_017.txt AC 68 ms 12160 KB
1_018.txt AC 68 ms 12160 KB
1_019.txt AC 68 ms 12160 KB
1_020.txt AC 69 ms 12288 KB
1_021.txt AC 69 ms 12160 KB
1_022.txt AC 68 ms 12160 KB
1_023.txt AC 68 ms 12160 KB
1_024.txt AC 68 ms 12160 KB
1_025.txt AC 68 ms 12160 KB
1_026.txt AC 69 ms 12160 KB
1_027.txt AC 70 ms 12288 KB
1_028.txt AC 70 ms 12160 KB
1_029.txt AC 69 ms 12160 KB
1_030.txt AC 68 ms 12160 KB
1_031.txt AC 71 ms 12160 KB
1_032.txt AC 68 ms 12160 KB
2_033.txt AC 161 ms 16128 KB
2_034.txt AC 114 ms 14080 KB
2_035.txt AC 193 ms 20224 KB
2_036.txt AC 183 ms 19584 KB
2_037.txt AC 218 ms 20352 KB
2_038.txt AC 195 ms 19328 KB
2_039.txt AC 233 ms 20608 KB
2_040.txt AC 146 ms 16384 KB
2_041.txt AC 252 ms 20864 KB
2_042.txt AC 94 ms 13824 KB
2_043.txt AC 269 ms 20992 KB
2_044.txt AC 187 ms 18048 KB
2_045.txt AC 276 ms 21248 KB
2_046.txt AC 267 ms 20864 KB
2_047.txt AC 286 ms 21504 KB
2_048.txt AC 153 ms 16256 KB
2_049.txt AC 293 ms 21632 KB
2_050.txt AC 200 ms 18432 KB
2_051.txt AC 239 ms 21888 KB
2_052.txt AC 215 ms 20992 KB
2_053.txt AC 161 ms 16000 KB
2_054.txt AC 242 ms 21888 KB
2_055.txt AC 178 ms 21888 KB
2_056.txt AC 177 ms 21888 KB
2_057.txt AC 188 ms 20992 KB