Submission #945301


Source Code Expand

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <cmath>
#include <map>
using namespace std;
#define MOD 1000000007
#define ADD(X,Y) ((X) = ((X) + (Y)%MOD) % MOD)
typedef long long i64; typedef vector<int> ivec; typedef vector<string> svec;

i64 modpow(i64 a, int p = MOD - 2)
{
	if (p == 0) return 1;
	i64 ret = modpow(a, p / 2);
	ret = ret * ret % MOD;
	if (p % 2 == 1) ret = ret * a % MOD;
	return ret;
}

struct segtree
{
	static const int DEPTH = 19;
	static const int N = 1 << DEPTH;

	int val[2 * N];

	void init()
	{
		for (int i = 0; i < 2 * N; ++i) val[i] = 0;
	}

	void incl(int p, int v)
	{
		p += N;
		while (p) {
			val[p] += v;
			p >>= 1;
		}
	}

	int query(int L, int R)
	{
		L += N; R += N;
		int ret = 0;
		while (L < R) {
			if (L & 1) ret += val[L++];
			if (R & 1) ret += val[--R];
			L >>= 1; R >>= 1;
		}
		return ret;
	}
};
int N, P[505050];
vector<int> uus;
bool used[505050];
segtree seg;
i64 invs[505050];

int main()
{
	scanf("%d", &N);
	for (int i = 0; i < N; ++i) {
		scanf("%d", P + i);
		--P[i];
	}
	invs[0] = 0;
	for (int i = 1; i <= N; ++i) invs[i] = modpow(i);

	i64 mult = 1;
	int uu = 0;

	for (int i = 0; i < N; ++i) {
		if (P[i] >= 0) used[P[i]] = true;
	}
	for (int i = 0; i < N; ++i) if (!used[i]) uus.push_back(i);

	seg.init();

	i64 ret = 0;
	i64 ap = 0;
	i64 waf = uus.size() * (uus.size() - 1) / 2 % MOD;
	waf = waf * invs[uus.size()] % MOD;
	if (uus.size() > 0) waf = waf * invs[uus.size() - 1] % MOD;

	i64 fuee = 1;
	int pohe = 0;
	for (int i = 0; i < N; ++i) {
		if (P[i] == -1) {
			++pohe;
			fuee = fuee * pohe % MOD;
		}
	}

	i64 m2 = 1;
	for (int i = N - 1; i >= 0; --i) {
		if (P[i] == -1) {
		//	ADD(ret, ap);
			ADD(ret, (waf * uu % MOD + ap * invs[uus.size()]) % MOD * m2 % MOD * fuee % MOD);
///			printf("%lld\n", (waf * uu + ap * invs[uus.size()]) % MOD * m2 % MOD * fuee % MOD);
//			printf("%lld %lld\n", uu, ap);
			++uu;
			mult = mult * uu % MOD;
		} else {
			int lt = lower_bound(uus.begin(), uus.end(), P[i]) - uus.begin();
			int gt = uus.size() - lt;
	//		int gt = (uus.size() - (lower_bound(uus.begin(), uus.end(), P[i]) - uus.begin()));
//			int lt = uus.size() - lt;
//			printf("%d %d\n", lt, gt);
			ADD(ap, gt);
			ADD(ret, (seg.query(0, P[i]) + lt * invs[uus.size()] % MOD * uu) % MOD * m2 % MOD * fuee);
			seg.incl(P[i], 1);
		}
		m2 *= N - i;
		m2 %= MOD;
	}
//	printf("%lld\n", mult);

	ADD(ret, mult);
//	ADD(ret, 1);
	//ret = ret * mult % MOD;

	printf("%lld\n", ret);

	return 0;
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User semiexp
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 2743 Byte
Status AC
Exec Time 283 ms
Memory 12528 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:68:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &N);
                 ^
./Main.cpp:70:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", P + 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 7 ms 4352 KB
0_001.txt AC 7 ms 4352 KB
0_002.txt AC 7 ms 4352 KB
0_003.txt AC 7 ms 4480 KB
0_004.txt AC 7 ms 4352 KB
1_005.txt AC 7 ms 4480 KB
1_006.txt AC 7 ms 4352 KB
1_007.txt AC 7 ms 4352 KB
1_008.txt AC 8 ms 4352 KB
1_009.txt AC 7 ms 4352 KB
1_010.txt AC 8 ms 4480 KB
1_011.txt AC 8 ms 4352 KB
1_012.txt AC 8 ms 4352 KB
1_013.txt AC 7 ms 4352 KB
1_014.txt AC 8 ms 4352 KB
1_015.txt AC 7 ms 4352 KB
1_016.txt AC 8 ms 4352 KB
1_017.txt AC 7 ms 4352 KB
1_018.txt AC 8 ms 4352 KB
1_019.txt AC 7 ms 4352 KB
1_020.txt AC 8 ms 4352 KB
1_021.txt AC 7 ms 4352 KB
1_022.txt AC 8 ms 4352 KB
1_023.txt AC 8 ms 4352 KB
1_024.txt AC 8 ms 4352 KB
1_025.txt AC 7 ms 4352 KB
1_026.txt AC 8 ms 4352 KB
1_027.txt AC 7 ms 4352 KB
1_028.txt AC 8 ms 4480 KB
1_029.txt AC 8 ms 4352 KB
1_030.txt AC 8 ms 4352 KB
1_031.txt AC 8 ms 4352 KB
1_032.txt AC 8 ms 4352 KB
2_033.txt AC 180 ms 12272 KB
2_034.txt AC 94 ms 8436 KB
2_035.txt AC 200 ms 12528 KB
2_036.txt AC 182 ms 11888 KB
2_037.txt AC 215 ms 12400 KB
2_038.txt AC 190 ms 11376 KB
2_039.txt AC 235 ms 12144 KB
2_040.txt AC 116 ms 8436 KB
2_041.txt AC 250 ms 11888 KB
2_042.txt AC 50 ms 5884 KB
2_043.txt AC 258 ms 11636 KB
2_044.txt AC 168 ms 9204 KB
2_045.txt AC 267 ms 11508 KB
2_046.txt AC 256 ms 11124 KB
2_047.txt AC 277 ms 11256 KB
2_048.txt AC 120 ms 7420 KB
2_049.txt AC 283 ms 11004 KB
2_050.txt AC 180 ms 8828 KB
2_051.txt AC 237 ms 10752 KB
2_052.txt AC 214 ms 10112 KB
2_053.txt AC 180 ms 12272 KB
2_054.txt AC 241 ms 10752 KB
2_055.txt AC 224 ms 10752 KB
2_056.txt AC 224 ms 10752 KB
2_057.txt AC 213 ms 11892 KB