QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#846056#8228. 排序aoliao100 ✓3387ms93360kbC++141.8kb2025-01-06 21:29:452025-01-06 21:29:45

Judging History

你现在查看的是最新测评结果

  • [2025-01-06 21:29:45]
  • 评测
  • 测评结果:100
  • 用时:3387ms
  • 内存:93360kb
  • [2025-01-06 21:29:45]
  • 提交

answer

#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
#define LL long long
#define PII pair<int, int>

const int N = 35, M = 15, mod = 1e9 + 7;
int n, m, d[M], ss[M][M];
PII ans;

inline void add(PII &a, PII b)
{
	if(a.first < b.first) a = b;
	else if(a.first == b.first) (a.second += b.second) >= mod && (a.second -= mod);
}

unordered_map<int, int> to[N];
int get(int x, int s)
{
	if(to[x].count(s)) return to[x][s];
	
	to[x][s] = 0;
	for(int i = 0; i < d[x]; i++)
	{
		int t = __builtin_popcount(s & ss[x][i]);
		if(t) to[x][s] |= ss[x][i] & (1 << (t - 1) * d[x] + i + 1) - 1;
	}
	return to[x][s];
}

//第x轮考虑y的贡献,结束时比a[y]小的集合为s
int dfs(int x, int y, int s)
{
	if(x == m) return 0;
	
	int y1 = __builtin_popcount(s & ss[x + 1][y % d[x + 1]]) * d[x + 1] + y % d[x + 1],
		cnt = y / d[x + 1] - __builtin_popcount(s & ss[x + 1][y % d[x + 1]] & (1 << y) - 1);
	return dfs(x + 1, y1, get(x + 1, s)) + cnt;
}

unordered_map<int, PII> g;
PII dp(int s)
{ 
	if(s == 0) return {0, 1};
	if(g.count(s)) return g[s];
	
	PII v = {0, 0};
	for(int i = 0; i <= n; i++)
		if(s >> i & 1 && (LL)s >> i + d[1] & 1 ^ 1)
		{
			PII t = dp(s ^ 1 << i);
			add(v, {t.first + dfs(1, i, s ^ 1 << i), t.second});
		}
	return g[s] = v;
}

int main()
{
	cin >> n >> m;
	n--;
	for(int i = 1; i <= m; i++) scanf("%d", &d[i]);
	reverse(d + 1, d + m + 1);
	while(d[m] > n) m--;
	reverse(d + 1, d + m + 1);
	for(int i = 1; i <= m; i++)
		for(int j = 0; j < d[i]; j++)
			for(int k = j; k <= n; k += d[i])
				ss[i][j] |= 1 << k;
	
	int res = 0;
	for(int i = 0; i < d[1]; i++) 
	{
		int t = (n - i) / d[1] + 1;
		res += t * (t - 1) / 2;
	}
	ans = dp((1 << n + 1) - 1);
	cout << ans.first + res << " " << ans.second << endl;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 18
Accepted

Test #1:

score: 18
Accepted
time: 1ms
memory: 3592kb

input:

2 2
2 1

output:

1 1

result:

ok 2 number(s): "1 1"

Test #2:

score: 18
Accepted
time: 0ms
memory: 3540kb

input:

5 4
5 4 2 1

output:

6 4

result:

ok 2 number(s): "6 4"

Test #3:

score: 18
Accepted
time: 0ms
memory: 3616kb

input:

8 4
6 3 2 1

output:

15 4

result:

ok 2 number(s): "15 4"

Test #4:

score: 18
Accepted
time: 0ms
memory: 3856kb

input:

8 6
8 7 5 4 2 1

output:

14 2

result:

ok 2 number(s): "14 2"

Test #5:

score: 18
Accepted
time: 0ms
memory: 3612kb

input:

8 3
8 7 1

output:

22 7

result:

ok 2 number(s): "22 7"

Test #6:

score: 18
Accepted
time: 0ms
memory: 3536kb

input:

8 1
1

output:

28 1

result:

ok 2 number(s): "28 1"

Subtask #2:

score: 27
Accepted

Dependency #1:

100%
Accepted

Test #7:

score: 27
Accepted
time: 1ms
memory: 3964kb

input:

16 2
6 1

output:

77 15

result:

ok 2 number(s): "77 15"

Test #8:

score: 27
Accepted
time: 16ms
memory: 4744kb

input:

16 8
10 9 8 7 6 5 4 1

output:

57 5

result:

ok 2 number(s): "57 5"

Test #9:

score: 27
Accepted
time: 18ms
memory: 4708kb

input:

16 10
10 9 8 7 6 5 4 3 2 1

output:

57 3

result:

ok 2 number(s): "57 3"

Test #10:

score: 27
Accepted
time: 15ms
memory: 4660kb

input:

16 7
10 9 8 6 5 4 1

output:

49 1

result:

ok 2 number(s): "49 1"

Test #11:

score: 27
Accepted
time: 3ms
memory: 3924kb

input:

16 4
7 6 2 1

output:

52 9

result:

ok 2 number(s): "52 9"

Subtask #3:

score: 21
Accepted

Dependency #2:

100%
Accepted

Test #12:

score: 21
Accepted
time: 3ms
memory: 4136kb

input:

22 3
5 3 1

output:

100 1

result:

ok 2 number(s): "100 1"

Test #13:

score: 21
Accepted
time: 0ms
memory: 3832kb

input:

22 1
1

output:

231 1

result:

ok 2 number(s): "231 1"

Test #14:

score: 21
Accepted
time: 106ms
memory: 12776kb

input:

22 4
10 8 3 1

output:

97 4

result:

ok 2 number(s): "97 4"

Test #15:

score: 21
Accepted
time: 123ms
memory: 12796kb

input:

22 5
10 7 6 3 1

output:

92 70

result:

ok 2 number(s): "92 70"

Test #16:

score: 21
Accepted
time: 139ms
memory: 13068kb

input:

22 6
10 9 8 7 3 1

output:

97 1

result:

ok 2 number(s): "97 1"

Test #17:

score: 21
Accepted
time: 222ms
memory: 13104kb

input:

22 10
10 9 8 7 6 5 4 3 2 1

output:

109 1

result:

ok 2 number(s): "109 1"

Subtask #4:

score: 10
Accepted

Test #18:

score: 10
Accepted
time: 2ms
memory: 3928kb

input:

14 2
10 1

output:

61 210

result:

ok 2 number(s): "61 210"

Test #19:

score: 10
Accepted
time: 0ms
memory: 3624kb

input:

18 2
2 1

output:

117 1

result:

ok 2 number(s): "117 1"

Test #20:

score: 10
Accepted
time: 478ms
memory: 46556kb

input:

30 2
9 1

output:

264 84

result:

ok 2 number(s): "264 84"

Test #21:

score: 10
Accepted
time: 379ms
memory: 39764kb

input:

29 2
9 1

output:

253 36

result:

ok 2 number(s): "253 36"

Test #22:

score: 10
Accepted
time: 41ms
memory: 9672kb

input:

25 2
8 1

output:

195 8

result:

ok 2 number(s): "195 8"

Subtask #5:

score: 24
Accepted

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Dependency #3:

100%
Accepted

Dependency #4:

100%
Accepted

Test #23:

score: 24
Accepted
time: 2060ms
memory: 93160kb

input:

30 4
10 9 5 1

output:

188 40

result:

ok 2 number(s): "188 40"

Test #24:

score: 24
Accepted
time: 3120ms
memory: 93324kb

input:

30 9
10 9 8 7 6 5 4 3 1

output:

184 6

result:

ok 2 number(s): "184 6"

Test #25:

score: 24
Accepted
time: 3001ms
memory: 93360kb

input:

30 8
10 9 8 7 4 3 2 1

output:

154 1

result:

ok 2 number(s): "154 1"

Test #26:

score: 24
Accepted
time: 3039ms
memory: 92604kb

input:

30 8
10 8 7 6 5 4 3 1

output:

155 1

result:

ok 2 number(s): "155 1"

Test #27:

score: 24
Accepted
time: 2577ms
memory: 92480kb

input:

30 6
10 8 6 4 3 1

output:

150 4

result:

ok 2 number(s): "150 4"

Test #28:

score: 24
Accepted
time: 3387ms
memory: 93320kb

input:

30 10
10 9 8 7 6 5 4 3 2 1

output:

184 6

result:

ok 2 number(s): "184 6"

Test #29:

score: 24
Accepted
time: 1950ms
memory: 77516kb

input:

29 6
10 9 7 5 3 1

output:

129 200

result:

ok 2 number(s): "129 200"

Extra Test:

score: 0
Extra Test Passed