# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
849509 | mickey080929 | Solitaire (JOI16_solitaire) | C++17 | 85 ms | 150876 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll modpow(ll a, ll b) {
ll ret = 1;
while (b > 0) {
if (b & 1) ret = ret * a % mod;
a = a * a % mod;
b >>= 1;
}
return ret;
}
ll C(ll a, ll b) {
if (b == 0) return 1;
if (b == 1) return a;
return a * (a+1) % mod;
}
ll n;
char a[2010][3];
ll dp1[2010][6010];
ll dp2[2010][6010];
ll fac[6010];
int main() {
fac[0] = 1;
for (ll i=1; i<=6000; i++) fac[i] = fac[i-1] * i % mod;
scanf("%lld", &n);
ll cnt = 0;
for (ll j=0; j<3; j++) {
for (ll i=1; i<=n; i++) {
scanf(" %c", &a[i][j]);
if (a[i][j] == 'x') cnt ++;
}
}
if (a[1][0] == 'x' || a[1][2] == 'x' || a[n][0] == 'x' || a[n][2] == 'x') {
printf("0");
return 0;
}
for (ll i=1; i<=n-1; i++) {
if (a[i][0] == 'x' && a[i+1][0] == 'x') {
printf("0");
return 0;
}
if (a[i][2] == 'x' && a[i+1][2] == 'x') {
printf("0");
return 0;
}
}
ll ans = fac[cnt];
ll p = 0;
for (ll i=1; i<=n; i++) {
if (a[i][1] == 'o') {
if (p == 0) continue;
ll sum = 0;
for (ll j=1; j<=p; j++) {
sum += dp1[i-1][j] + dp2[i-1][j];
sum %= mod;
}
ans = ans * modpow(fac[p], mod-2) % mod * sum % mod;
p = 0;
continue;
}
ll t = (a[i][0] == 'x') + (a[i][2] == 'x');
if (p > 0) {
ll sum = 0;
for (ll j=1; j<=p; j++) sum = (sum + dp1[i-1][j]) % mod;
for (ll j=1; j<=p+1; j++) {
dp1[i][j+t] = sum * C(j, t) % mod;
}
sum = 0;
for (ll j=p; j>=1; j--) {
sum += dp2[i-1][j];
sum %= mod;
dp1[i][j+t] = (dp1[i][j+t] + sum * C(j, t)) % mod;
}
sum = 0;
for (ll j=2; j<=p+1; j++) {
sum += dp1[i-1][j-1];
sum %= mod;
for (ll k=0; k<=t-1; k++) {
dp2[i][j+k] += sum * C(j, k) % mod * C(p-j+2, t-k) % mod * C(t, k);
dp2[i][j+k] %= mod;
}
}
}
else {
dp1[i][t+1] = fac[t];
if (i != 1) {
if (t >= 1) dp2[i][1] = fac[t];
if (t == 2) dp2[i][2] = 2;
}
}
p += t + 1;
}
if (p != 0) {
ll sum = 0;
for (ll j=1; j<=p; j++) {
sum += dp1[n][j];
sum %= mod;
}
ans = ans * modpow(fac[p], mod-2) % mod * sum % mod;
}
printf("%lld", ans);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |