CSES - Datatähti 2019 alku - Results
Submission details
Task:Ruudukko
Sender:ollpu
Submission time:2018-10-03 13:12:51 +0300
Language:C++
Status:READY
Result:14
Feedback
groupverdictscore
#10
#2ACCEPTED14
#30
Test results
testverdicttimegroup
#1ACCEPTED0.02 s1details
#2ACCEPTED0.02 s1details
#3ACCEPTED0.03 s1details
#4ACCEPTED0.02 s1details
#5ACCEPTED0.03 s1details
#6ACCEPTED0.02 s1details
#70.02 s1details
#8ACCEPTED0.02 s1details
#90.02 s1details
#10ACCEPTED0.01 s1details
#11ACCEPTED0.02 s2details
#12ACCEPTED0.03 s2details
#13ACCEPTED0.02 s2details
#14ACCEPTED0.02 s2details
#15ACCEPTED0.02 s2details
#16ACCEPTED0.03 s2details
#17ACCEPTED0.03 s2details
#18ACCEPTED0.02 s2details
#19ACCEPTED0.03 s2details
#20ACCEPTED0.03 s2details
#210.02 s3details
#220.02 s3details
#230.01 s3details
#240.03 s3details
#25ACCEPTED0.03 s3details
#260.02 s3details
#270.02 s3details
#280.02 s3details
#290.02 s3details
#30ACCEPTED0.02 s3details

Code

// joo joo, teen rubyassemblyllä myöhemmin

#include <bits/stdc++.h>
using namespace std;
const long M = 1e9+7;
const int N = 501;
long fac[N];
long h[N][N], C[N][N];
int pos[2][2][N], z[2][N];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  fac[0] = 1;
  fac[1] = 1;
  for (int i = 2; i <= 500; ++i) {
    fac[i] = i*fac[i-1] %M;
  }
  h[0][0] = 1;
  for (int i = 1; i <= 500; ++i) {
    h[i][0] = h[i-1][0]*i %M;
  }
  for (int i = 1; i <= 500; ++i) {
    for (int j = 1; j <= i; ++j) {
      h[i][j] = (i-1)*h[i-1][j-1];
      if (j >= 2) h[i][j] += (j-1)*h[i-2][j-2];
      h[i][j] %= M;
    }
  }
  for (int i = 0; i <= 500; ++i) {
    C[i][0] = 1;
  }
  for (int i = 1; i <= 500; ++i) {
    for (int j = 1; j <= i; ++j) {
      C[i][j] = (C[i-1][j]+C[i-1][j-1]) %M;
    }
  }
  int sn;
  cin >> sn;
  for (int i = 1; i <= sn; ++i) {
    string s;
    cin >> s;
    for (int j = 1; j <= sn; ++j) {
      char c = s[j-1];
      if (c == '.') continue;
      if (c == 'A') {
        pos[0][0][i] = j;
        pos[0][1][j] = i;
      } else {
        pos[1][0][i] = j;
        pos[1][1][j] = i;
      }
    }
  }
  int a = 0, b = 0, l = 0, r = 0, pa = 0, pb = 0, lp = 0, rp = 0;
  for (int i = 1; i <= sn; ++i) {
    if (!z[0][i] && ((pos[0][0][i] == 0) != (pos[1][0][i] == 0))) {
      int i0 = pos[0][0][i] == 0, i1 = 0, i2 = i;
      int len = 0;
      z[i1][i2] = 1;
      while (pos[i0][i1][i2]) {
        len++;
        tie(i0, i1, i2) = make_tuple(!i0, !i1, pos[i0][i1][i2]);
        z[i1][i2] = 1;
      }
      if (len == 1) {
        if (pos[0][0][i]) a++;
        else b++;
      } else {
        len %= 2;
        if (len) {
          if (pos[0][0][i]) pa++;
          else pb++;
        } else {
          l++;
        }
      }
    }
    if (pos[0][0][i] == 0 && pos[1][0][i] == 0) {
      lp++;
    }
  }
  for (int i = 1; i <= sn; ++i) {
    if (!z[1][i] && ((pos[0][1][i] == 0) != (pos[1][1][i] == 0))) r++;
    if (pos[0][1][i] == 0 && pos[1][1][i] == 0) {
      rp++;
    }
  }
  r /= 2;
  long res = 0;
  for (int ipa = 0; ipa <= pa; ++ipa) {
    for (int ipb = 0; ipb <= pb; ++ipb) {
      int ta = a+ipa, tb = b+ipb;
      int bc = ta+l+lp, ac = tb+l+lp;
      long ml = 0;
      for (int z = max(0, min(lp,rp)-ta-l); z <= min(lp, rp); ++z) {
        long x = h[bc-z][ta];
        x *= C[lp][z]*C[rp][z] %M;
        x %= M;
        x *= fac[z]*h[ac][tb+z] %M;
        x %= M;
        ml = (ml+x)%M;
      }
      ml *= C[pa][ipa]*C[pb][ipb] %M;
      ml %= M;
      res = (res+ml)%M;
    }
  }
  cout << res << endl;
}

Test details

Test 1

Group: 1

Verdict: ACCEPTED

input
2
..
..

correct output
2

user output
2

Test 2

Group: 1

Verdict: ACCEPTED

input
2
..
A.

correct output
1

user output
1

Test 3

Group: 1

Verdict: ACCEPTED

input
2
B.
.A

correct output
0

user output
0

Test 4

Group: 1

Verdict: ACCEPTED

input
3
...
...
...

correct output
12

user output
12

Test 5

Group: 1

Verdict: ACCEPTED

input
4
....
....
....
....

correct output
216

user output
216

Test 6

Group: 1

Verdict: ACCEPTED

input
5
.....
.....
.....
.....
...

correct output
5280

user output
5280

Test 7

Group: 1

Verdict:

input
5
....A
.....
.....
.....
...

correct output
264

user output
678

Test 8

Group: 1

Verdict: ACCEPTED

input
5
B....
.....
.....
.A.B.
...

correct output
22

user output
22

Test 9

Group: 1

Verdict:

input
5
B.A..
....A
.....
A.B..
...

correct output
2

user output
6

Test 10

Group: 1

Verdict: ACCEPTED

input
5
A.B..
BA...
.B.A.
...BA
...

correct output
1

user output
1

Test 11

Group: 2

Verdict: ACCEPTED

input
10
..........
..........
..........
..........
...

correct output
306442892

user output
306442892

Test 12

Group: 2

Verdict: ACCEPTED

input
50
.................................

correct output
694861480

user output
694861480

Test 13

Group: 2

Verdict: ACCEPTED

input
111
.................................

correct output
555319110

user output
555319110

Test 14

Group: 2

Verdict: ACCEPTED

input
222
.................................

correct output
108372237

user output
108372237

Test 15

Group: 2

Verdict: ACCEPTED

input
333
.................................

correct output
259107857

user output
259107857

Test 16

Group: 2

Verdict: ACCEPTED

input
444
.................................

correct output
19906314

user output
19906314

Test 17

Group: 2

Verdict: ACCEPTED

input
497
.................................

correct output
224313667

user output
224313667

Test 18

Group: 2

Verdict: ACCEPTED

input
498
.................................

correct output
929574601

user output
929574601

Test 19

Group: 2

Verdict: ACCEPTED

input
499
.................................

correct output
600226043

user output
600226043

Test 20

Group: 2

Verdict: ACCEPTED

input
500
.................................

correct output
198353194

user output
198353194

Test 21

Group: 3

Verdict:

input
499
.................................

correct output
840243733

user output
637762816

Test 22

Group: 3

Verdict:

input
499
........................A........

correct output
4146290

user output
661753216

Test 23

Group: 3

Verdict:

input
499
B.........A......................

correct output
173518884

user output
506623982

Test 24

Group: 3

Verdict:

input
499
...A....B........................

correct output
20044800

user output
32140800

Test 25

Group: 3

Verdict: ACCEPTED

input
499
AB...............................

correct output
2

user output
2

Test 26

Group: 3

Verdict:

input
500
.................................

correct output
121064146

user output
757959696

Test 27

Group: 3

Verdict:

input
500
.................................

correct output
848435259

user output
938875674

Test 28

Group: 3

Verdict:

input
500
.....B........A..................

correct output
296240911

user output
354820232

Test 29

Group: 3

Verdict:

input
500
.A......B........................

correct output
2196

user output
2772

Test 30

Group: 3

Verdict: ACCEPTED

input
500
...AB............................

correct output
1

user output
1