Submission #9501723


Source Code Expand

#include <cstdio>
#include <algorithm>

typedef long long LL;
const int Mod = 1000000007;
const int MN = 75;

inline int qPow(int b, int e) {
	int a = 1;
	for (; e; e >>= 1, b = (LL)b * b % Mod)
		if (e & 1) a = (LL)a * b % Mod;
	return a;
}

int Fac[MN * 2], iFac[MN * 2];
inline void Init(int N) {
	Fac[0] = 1;
	for (int i = 1; i <= N; ++i) Fac[i] = (LL)Fac[i - 1] * i % Mod;
	iFac[N] = qPow(Fac[N], Mod - 2);
	for (int i = N; i >= 1; --i) iFac[i - 1] = (LL)iFac[i] * i % Mod;
}

int Len;
char Str[MN];
int posr[MN], nxposb[MN], rcnt;

int N, Ans;

int stk[MN];
inline void Calc(int cnt, int csum) {
	int Sum = 0;
	if (!cnt) Sum = 1;
	else if (cnt <= rcnt) {
		static int vis[MN];
		for (int i = 1; i <= cnt; ++i) vis[i] = posr[i];
		int tot = cnt, mxp = 1;
		for (int i = 1; i <= cnt && stk[i] >= 2; ++i)
			mxp = vis[++tot] = nxposb[std::max(mxp, vis[i])];
		if (mxp <= Len) {
			std::inplace_merge(vis + 1, vis + cnt + 1, vis + tot + 1);
			int nwp = Len + 1, sum = 0, now = cnt, ok = 1;
			while (now && stk[now] == 1) --now;
			for (int i = tot; i >= 1; --i) {
				sum += nwp - vis[i] - 1;
				if (Str[vis[i]] == 'b') {
					sum -= stk[now] - 2;
					if (sum < 0) { ok = 0; break; }
					--now;
				}
				nwp = vis[i];
			}
			if (ok) {
				Sum = Fac[cnt];
				int len = 0, num = 1;
				for (int i = 1; i <= cnt; ++i) {
					++len;
					num += stk[i] * 2;
					if (i == cnt || stk[i] != stk[i + 1]) {
						Sum = (LL)Sum * iFac[len] % Mod;
						len = 0;
					}
				}
				Sum = (LL)Sum * Fac[N - csum + num] % Mod * iFac[num - 1] % Mod * iFac[N - csum + 1] % Mod;
			}
		}
	}
	Ans -= (Ans += Sum) >= Mod ? Mod : 0;
}
void DFS(int st, int mx, int sum) {
	Calc(st - 1, sum);
	if (sum < N) {
		stk[st] = 1;
		DFS(st + 1, 1, sum + 2);
	}
	for (int i = 2; i <= mx; ++i) {
		if (sum + i * 2 <= N + 3) {
			stk[st] = i;
			DFS(st + 1, i, sum + i * 2 - 2);
		}
	}
}

int main() {
	scanf("%d%d%s", &N, &Len, Str + 1);
	Init(N * 2 + 2);
	for (int i = 1; i <= Len; ++i)
		if (Str[i] == 'r')
			posr[++rcnt] = i;
	int nwposb = Len + 1;
	nxposb[Len + 1] = Len + 1;
	for (int i = Len; i >= 1; --i) {
		nxposb[i] = nwposb;
		if (Str[i] == 'b')
			nwposb = i;
	}
	DFS(1, (N + 3) / 2, 0);
	printf("%d\n", Ans);
	return 0;
}

Submission Info

Submission Time
Task F - ColoringBalls
User PinkRabbit
Language C++14 (GCC 5.4.1)
Score 1100
Code Size 2311 Byte
Status AC
Exec Time 89 ms
Memory 256 KiB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:84:36: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%s", &N, &Len, Str + 1);
                                    ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1100 / 1100
Status
AC × 4
AC × 112
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 1_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, 1_033.txt, 1_034.txt, 1_035.txt, 1_036.txt, 1_037.txt, 1_038.txt, 1_039.txt, 1_040.txt, 1_041.txt, 1_042.txt, 1_043.txt, 1_044.txt, 1_045.txt, 1_046.txt, 1_047.txt, 1_048.txt, 1_049.txt, 1_050.txt, 1_051.txt, 1_052.txt, 1_053.txt, 1_054.txt, 1_055.txt, 1_056.txt, 1_057.txt, 1_058.txt, 1_059.txt, 1_060.txt, 1_061.txt, 1_062.txt, 1_063.txt, 1_064.txt, 1_065.txt, 1_066.txt, 1_067.txt, 1_068.txt, 1_069.txt, 1_070.txt, 1_071.txt, 1_072.txt, 1_073.txt, 1_074.txt, 1_075.txt, 1_076.txt, 1_077.txt, 1_078.txt, 1_079.txt, 1_080.txt, 1_081.txt, 1_082.txt, 1_083.txt, 1_084.txt, 1_085.txt, 1_086.txt, 1_087.txt, 1_088.txt, 1_089.txt, 1_090.txt, 1_091.txt, 1_092.txt, 1_093.txt, 1_094.txt, 1_095.txt, 1_096.txt, 1_097.txt, 1_098.txt, 1_099.txt, 1_100.txt, 1_101.txt, 1_102.txt, 1_103.txt, 1_104.txt, 1_105.txt, 1_106.txt, 1_107.txt, 1_108.txt, 1_109.txt, 1_110.txt, 1_111.txt
Case Name Status Exec Time Memory
0_000.txt AC 1 ms 256 KiB
0_001.txt AC 1 ms 256 KiB
0_002.txt AC 1 ms 256 KiB
0_003.txt AC 88 ms 256 KiB
1_004.txt AC 1 ms 256 KiB
1_005.txt AC 1 ms 256 KiB
1_006.txt AC 1 ms 256 KiB
1_007.txt AC 1 ms 256 KiB
1_008.txt AC 1 ms 256 KiB
1_009.txt AC 1 ms 256 KiB
1_010.txt AC 1 ms 256 KiB
1_011.txt AC 1 ms 256 KiB
1_012.txt AC 1 ms 256 KiB
1_013.txt AC 1 ms 256 KiB
1_014.txt AC 1 ms 256 KiB
1_015.txt AC 1 ms 256 KiB
1_016.txt AC 1 ms 256 KiB
1_017.txt AC 1 ms 256 KiB
1_018.txt AC 1 ms 256 KiB
1_019.txt AC 1 ms 256 KiB
1_020.txt AC 1 ms 256 KiB
1_021.txt AC 1 ms 256 KiB
1_022.txt AC 1 ms 256 KiB
1_023.txt AC 1 ms 256 KiB
1_024.txt AC 1 ms 256 KiB
1_025.txt AC 1 ms 256 KiB
1_026.txt AC 1 ms 256 KiB
1_027.txt AC 1 ms 256 KiB
1_028.txt AC 1 ms 256 KiB
1_029.txt AC 1 ms 256 KiB
1_030.txt AC 1 ms 256 KiB
1_031.txt AC 1 ms 256 KiB
1_032.txt AC 1 ms 256 KiB
1_033.txt AC 1 ms 256 KiB
1_034.txt AC 1 ms 256 KiB
1_035.txt AC 1 ms 256 KiB
1_036.txt AC 1 ms 256 KiB
1_037.txt AC 1 ms 256 KiB
1_038.txt AC 1 ms 256 KiB
1_039.txt AC 1 ms 256 KiB
1_040.txt AC 1 ms 256 KiB
1_041.txt AC 1 ms 256 KiB
1_042.txt AC 1 ms 256 KiB
1_043.txt AC 1 ms 256 KiB
1_044.txt AC 1 ms 256 KiB
1_045.txt AC 1 ms 256 KiB
1_046.txt AC 1 ms 256 KiB
1_047.txt AC 1 ms 256 KiB
1_048.txt AC 1 ms 256 KiB
1_049.txt AC 1 ms 256 KiB
1_050.txt AC 1 ms 256 KiB
1_051.txt AC 1 ms 256 KiB
1_052.txt AC 1 ms 256 KiB
1_053.txt AC 1 ms 256 KiB
1_054.txt AC 1 ms 256 KiB
1_055.txt AC 1 ms 256 KiB
1_056.txt AC 1 ms 256 KiB
1_057.txt AC 1 ms 256 KiB
1_058.txt AC 1 ms 256 KiB
1_059.txt AC 1 ms 256 KiB
1_060.txt AC 1 ms 256 KiB
1_061.txt AC 1 ms 256 KiB
1_062.txt AC 1 ms 256 KiB
1_063.txt AC 1 ms 256 KiB
1_064.txt AC 1 ms 256 KiB
1_065.txt AC 1 ms 256 KiB
1_066.txt AC 1 ms 256 KiB
1_067.txt AC 8 ms 256 KiB
1_068.txt AC 6 ms 256 KiB
1_069.txt AC 2 ms 256 KiB
1_070.txt AC 1 ms 256 KiB
1_071.txt AC 3 ms 256 KiB
1_072.txt AC 8 ms 256 KiB
1_073.txt AC 8 ms 256 KiB
1_074.txt AC 5 ms 256 KiB
1_075.txt AC 2 ms 256 KiB
1_076.txt AC 8 ms 256 KiB
1_077.txt AC 8 ms 256 KiB
1_078.txt AC 2 ms 256 KiB
1_079.txt AC 1 ms 256 KiB
1_080.txt AC 3 ms 256 KiB
1_081.txt AC 8 ms 256 KiB
1_082.txt AC 8 ms 256 KiB
1_083.txt AC 8 ms 256 KiB
1_084.txt AC 2 ms 256 KiB
1_085.txt AC 4 ms 256 KiB
1_086.txt AC 4 ms 256 KiB
1_087.txt AC 4 ms 256 KiB
1_088.txt AC 4 ms 256 KiB
1_089.txt AC 4 ms 256 KiB
1_090.txt AC 4 ms 256 KiB
1_091.txt AC 4 ms 256 KiB
1_092.txt AC 4 ms 256 KiB
1_093.txt AC 4 ms 256 KiB
1_094.txt AC 54 ms 256 KiB
1_095.txt AC 40 ms 256 KiB
1_096.txt AC 13 ms 256 KiB
1_097.txt AC 4 ms 256 KiB
1_098.txt AC 31 ms 256 KiB
1_099.txt AC 46 ms 256 KiB
1_100.txt AC 53 ms 256 KiB
1_101.txt AC 39 ms 256 KiB
1_102.txt AC 16 ms 256 KiB
1_103.txt AC 88 ms 256 KiB
1_104.txt AC 83 ms 256 KiB
1_105.txt AC 17 ms 256 KiB
1_106.txt AC 4 ms 256 KiB
1_107.txt AC 55 ms 256 KiB
1_108.txt AC 89 ms 256 KiB
1_109.txt AC 88 ms 256 KiB
1_110.txt AC 80 ms 256 KiB
1_111.txt AC 16 ms 256 KiB