Submission #2094596


Source Code Expand

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll mod = 1000000007;
int d[505050];
int occ[505050];
#define SIZE 524288
class BIT
{
public:
	int bit[SIZE + 1];
	void add(int a, int b)
	{
		a++;
		for (;;)
		{
			bit[a] += b;
			a += a&-a;
			if (a > SIZE)return;
		}
	}
	int get(int a)
	{
		a++;
		int ret = 0;
		for (;;)
		{
			ret += bit[a];
			a -= a&-a;
			if (a == 0)return ret;
		}
	}
};
BIT bi;
ll po(ll a, ll b)
{
	if (b == 0)return 1;
	ll z = po(a, b / 2);
	z = z*z%mod;
	if (b & 1)z = z*a%mod;
	return z;
}
ll inv(ll a)
{
	return po(a, mod - 2);
}
int main()
{
	int num;
	scanf("%d", &num);
	for (int i = 0; i < num; i++)scanf("%d", &d[i]), occ[d[i]] = 1;
	vector<int>v;
	for (int i = 1; i <= num; i++)if (occ[i] == 0)v.push_back(i);
	ll kai = 1;
	for (int i = 1; i < v.size(); i++)kai = kai*i%mod;
	ll k2 = 1;
	for (int i = 1; i <= v.size(); i++)k2 = k2*i%mod;
	ll tim = 1;
	ll sum = 0;
	ll ans = 0;
	ll dd = 0;
	for (int i = num - 1; i >= 0; i--)
	{
		if (d[i] == 0)
		{
			ans += (sum + v.size()*dd%mod*inv(2) % mod)*tim%mod*kai;
			ans %= mod;
			dd++;
		}
		else
		{
			int low = lower_bound(v.begin(), v.end(), d[i]) - v.begin();
			ll ko = (bi.get(d[i]) + dd*low%mod*inv(v.size())) % mod;
			ans += ko*tim%mod*k2;
			ans %= mod;
			sum += v.size() - low;
			sum %= mod;
			bi.add(d[i], 1);
		}
		tim *= num - i;
		tim %= mod;
	}
	printf("%lld\n", (ans + k2) % mod);
}

Submission Info

Submission Time
Task E - Encyclopedia of Permutations
User DEGwer
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 1520 Byte
Status AC
Exec Time 536 ms
Memory 8048 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:52:19: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &num);
                   ^
./Main.cpp:53:64: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  for (int i = 0; i < num; i++)scanf("%d", &d[i]), occ[d[i]] = 1;
                                                                ^

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 2 ms 2304 KB
0_001.txt AC 1 ms 2304 KB
0_002.txt AC 2 ms 2304 KB
0_003.txt AC 1 ms 2304 KB
0_004.txt AC 2 ms 2304 KB
1_005.txt AC 2 ms 2304 KB
1_006.txt AC 2 ms 2304 KB
1_007.txt AC 2 ms 2304 KB
1_008.txt AC 4 ms 2304 KB
1_009.txt AC 3 ms 2304 KB
1_010.txt AC 4 ms 2304 KB
1_011.txt AC 4 ms 2304 KB
1_012.txt AC 4 ms 2304 KB
1_013.txt AC 2 ms 2304 KB
1_014.txt AC 4 ms 2304 KB
1_015.txt AC 3 ms 2304 KB
1_016.txt AC 4 ms 2304 KB
1_017.txt AC 2 ms 2304 KB
1_018.txt AC 4 ms 2304 KB
1_019.txt AC 3 ms 2304 KB
1_020.txt AC 4 ms 2304 KB
1_021.txt AC 3 ms 2304 KB
1_022.txt AC 4 ms 2304 KB
1_023.txt AC 3 ms 2304 KB
1_024.txt AC 4 ms 2304 KB
1_025.txt AC 2 ms 2304 KB
1_026.txt AC 4 ms 2304 KB
1_027.txt AC 3 ms 2304 KB
1_028.txt AC 4 ms 2304 KB
1_029.txt AC 4 ms 2304 KB
1_030.txt AC 4 ms 2304 KB
1_031.txt AC 4 ms 2304 KB
1_032.txt AC 4 ms 2304 KB
2_033.txt AC 444 ms 6388 KB
2_034.txt AC 224 ms 4344 KB
2_035.txt AC 463 ms 8048 KB
2_036.txt AC 425 ms 7536 KB
2_037.txt AC 481 ms 7792 KB
2_038.txt AC 417 ms 7152 KB
2_039.txt AC 494 ms 7536 KB
2_040.txt AC 243 ms 4980 KB
2_041.txt AC 506 ms 7408 KB
2_042.txt AC 95 ms 3324 KB
2_043.txt AC 522 ms 7156 KB
2_044.txt AC 336 ms 5492 KB
2_045.txt AC 521 ms 6900 KB
2_046.txt AC 500 ms 6772 KB
2_047.txt AC 529 ms 6648 KB
2_048.txt AC 229 ms 4220 KB
2_049.txt AC 536 ms 6524 KB
2_050.txt AC 343 ms 5116 KB
2_051.txt AC 452 ms 6144 KB
2_052.txt AC 405 ms 5760 KB
2_053.txt AC 447 ms 6388 KB
2_054.txt AC 487 ms 6272 KB
2_055.txt AC 438 ms 6144 KB
2_056.txt AC 442 ms 6144 KB
2_057.txt AC 472 ms 7284 KB