Submission #71349469


Source Code Expand

Copy
#include <stdio.h>
#define MOD_BY 1000000007
int add(int a, int b) {
return a + b - MOD_BY * (a + b >= MOD_BY);
}
int sub(int a, int b) {
return b == 0 ? a : add(a, MOD_BY - b);
}
int N;
char s[4096];
int memo[4096][4096];
int memo_sum[4096][4096];
int main(void) {
int pos, available;
if (scanf("%d", &N) != 1) return 1;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>

#define MOD_BY 1000000007

int add(int a, int b) {
	return a + b - MOD_BY * (a + b >= MOD_BY);
}

int sub(int a, int b) {
	return b == 0 ? a : add(a, MOD_BY - b);
}

int N;
char s[4096];

int memo[4096][4096];
int memo_sum[4096][4096];

int main(void) {
	int pos, available;
	if (scanf("%d", &N) != 1) return 1;
	if (scanf("%4095s", s) != 1) return 1;
	memo[N][0] = 1;
	memo_sum[N][0] = 1;
	for (pos = N - 1; pos >= 0; pos--) {
		for (available = 0; available <= N - pos; available++) {
			int unavailable = N - pos - available; /* この要素の候補ではない要素の数を計算する */
			int start, end;
			if ((pos == 0 ? '<' : s[pos - 1]) == s[pos]) {
				/* 同じ方向 → 今の所より「上」のみを次に使える */
				end = available - 0 - 1;
				start = available - (available - 1) - 1;
			} else {
				/* 違う方向 → 今の所より「下」のみを次に使える */
				start = unavailable + 0;
				end = unavailable + (available - 1);
			}
			if (start <= end) {
				/* 累積和を用いて和を計算する */
				memo[pos][available] = sub(memo_sum[pos + 1][end], start > 0 ? memo_sum[pos + 1][start - 1] : 0);
			} else {
				/* ループが1回も回らないことに相当する */
				memo[pos][available] = 0;
			}
		}
		/* この pos に関する計算が完了したので、累積和を計算する */
		memo_sum[pos][0] = memo[pos][0];
		for (available = 1; available <= N - pos; available++) {
			memo_sum[pos][available] = add(memo_sum[pos][available - 1], memo[pos][available]);
		}
	}
	printf("%d\n", memo[0][N]);
	return 0;
}

Submission Info

Submission Time
Task T - Permutation
User mikecat
Language C (gcc 12.2.0)
Score 100
Code Size 1657 Byte
Status AC
Exec Time 26 ms
Memory 49412 KiB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 17
Set Name Test Cases
All 0_00, 0_01, 0_02, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13
Case Name Status Exec Time Memory
0_00 AC 0 ms 1680 KiB
0_01 AC 0 ms 1608 KiB
0_02 AC 0 ms 1888 KiB
1_00 AC 0 ms 1728 KiB
1_01 AC 0 ms 1708 KiB
1_02 AC 24 ms 49280 KiB
1_03 AC 23 ms 49292 KiB
1_04 AC 26 ms 49332 KiB
1_05 AC 25 ms 49412 KiB
1_06 AC 24 ms 49276 KiB
1_07 AC 24 ms 48484 KiB
1_08 AC 24 ms 48516 KiB
1_09 AC 24 ms 48780 KiB
1_10 AC 24 ms 48060 KiB
1_11 AC 23 ms 48112 KiB
1_12 AC 22 ms 46636 KiB
1_13 AC 24 ms 49124 KiB


2025-11-30 (Sun)
11:49:16 +09:00