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 |
|
|
| 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 |