QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#17072 | #1790. 机器人游戏 | Qingyu | 100 ✓ | 19ms | 13628kb | C++20 | 3.6kb | 2022-01-01 18:11:38 | 2022-05-04 13:09:18 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
typedef unsigned int uint;
typedef pair <int, int> pii;
const int N = 65537, M = 1005, w[] = {3, 3, 3, 2, 3, 2, 1, 1, 3, 1, 2, 1, 2, 1, 1, 1};
int n, m, n1, n2, len[M], popcnt[N], p2[N], p3[N], f[N][4], ans, prod[N][2], dp[33][N][2];
uint mask[M][4]; char str[105], s[M][105];
inline int PLUS(int x, int y) {
x += y;
return x >= MOD ? x - MOD : x;
}
inline void Insert(int s0, int s1, int s2, int s3) {
s2 ^= s0 | s1 | s3;
f[s0][0] ++, f[s1][0] ++, f[s3][0] ++, f[s2][1] ++;
f[s0|s1][2] ++, f[s1|s3][2] ++, f[s0|s2][3] ++, f[s2|s3][3] ++;
}
inline void FMT(int n) {
for (int i=0; i<n; i++)
for (int j=1; j<1<<n; j++)
if (j & 1 << i)
for (int k=0; k<=3; k++)
f[j ^ 1 << i][k] += f[j][k];
}
#define Get(i) 1ll * p3[f[i][0] + f[i][1]] * p2[f[i][2] + f[i][3] - (f[i][0] + f[i][1] << 1)] % MOD
#define trans(_i, _j, _k, cj, ck) \
dp[_i][_j][_k] = (dp[_i][_j][_k] + 1ll * dp[i][j][k] * prod[cj][ck]) % MOD, \
dp[_i][_j|1][_k] = (dp[_i][_j|1][_k] + 1ll * (MOD - dp[i][j][k]) * prod[cj|1][ck]) % MOD
int main() {
cin >> n >> m, n1 = max(n, 2) >> 1, n2 = n - n1, p2[0] = p3[0] = 1;
for (int i=1; i<=n*m; i++)
p2[i] = PLUS(p2[i-1], p2[i-1]), p3[i] = PLUS(p3[i-1], PLUS(p3[i-1], p3[i-1]));
for (int i=1; i<1<<max(n1,n2); i++)
popcnt[i] = popcnt[i>>1] + (i & 1);
for (int i=1; i<=m; i++) {
scanf ("%s", str);
s[i][len[i]=1] = 2;
for (auto j : str) {
if (! j) break;
isdigit(j) ? s[i][len[i]] = (j - '0') * 3 : j == '*' ? s[i][len[i]] ^= 3 : s[i][++len[i]] = 2;
}
if (len[i] > n) continue;
for (int j=1; j<=len[i]; j++)
mask[i][s[i][j]] |= 1u << j - 1;
int lim = (1 << n1) - (1 << n1 - min(n1, n - len[i] + 1));
for (int j=1; j<=n1; j++)
Insert(mask[i][0] << n1 - j & lim, mask[i][1] << n1 - j & lim, lim, mask[i][3] << n1 - j & lim);
for (int j=n1+1; j<=n; j++)
Insert(mask[i][0] >> j - n1 & lim, mask[i][1] >> j - n1 & lim, lim, mask[i][3] >> j - n1 & lim);
} FMT(n1);
for (int i=1; i<1<<n1; i++) {
int _ = Get(i);
ans = PLUS(ans, popcnt[i] & 1 ? _ : MOD - _);
for (int j=0; j<=3; j++)
f[i][j] = 0;
}
for (int l=1; l<=n2; l++) {
int cnt = 0, lim = (1 << l) - 1;
for (int i=1; i<=m; i++)
if (len[i] <= l) {
++ cnt;
Insert(mask[i][0] & lim, mask[i][1] & lim, lim, mask[i][3] & lim);
}
if (! cnt) continue;
FMT(l);
for (int i=1; i<1<<l; i++) {
prod[i][0] = Get(i), prod[i][1] = 1ll * p3[f[i][1]] * p2[f[i][3] - (f[i][1] << 1)] % MOD;
for (int j=0; j<=3; j++)
f[i][j] = 0;
}
prod[0][0] = prod[0][1] = p3[cnt];
for (int i=1; i<=n-l+2; i++)
for (int j=0; j<1<<l-1; j++)
dp[i][j][0] = dp[i][j][1] = 0;
dp[1][0][0] = 1; lim >>= 1;
if (l == 1) {
for (int i=1; i<n; i++)
dp[i+1][0][0] = 1ll * dp[i][0][0] * prod[0][1] % MOD,
dp[i+1][0][1] = (1ll * (MOD - dp[i][0][0]) * prod[1][1] + 1ll * dp[i][0][1] * (prod[0][1] + MOD - prod[1][1])) % MOD;
ans = (ans + 1ll * dp[n][0][0] * prod[1][0] + 1ll * dp[n][0][1] * prod[1][1]) % MOD;
} else {
for (int i=1; i<=n-l+1; i++)
for (int j=0; j<1<<min(i,l)-1; j++)
for (int k=0; k<=1; k++)
if (dp[i][j][k])
trans(i + 1, j << 1 & lim, k | (bool) (j & 1 << l - 2), j << 1, k | (i != n - l + 1));
for (int j=1; j<=lim; j+=2)
for (int k=0; k<=1; k++)
if (dp[n-l+2][j][k]) {
int c = 1, _j = j, _k = k;
for (int i=n-l+2; i<=n; i++)
c = 1ll * c * prod[_j<<1][_k] % MOD, _k |= (bool) (_j & 1 << l - 2), (_j <<= 1) &= lim;
ans = (ans + 1ll * c * (MOD - dp[n-l+2][j][k])) % MOD;
}
}
} return cout << ans << endl, 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 4
Accepted
time: 0ms
memory: 5712kb
input:
1 1 0
output:
3
result:
ok single line: '3'
Test #2:
score: 4
Accepted
time: 0ms
memory: 5808kb
input:
1 1 *
output:
3
result:
ok single line: '3'
Test #3:
score: 4
Accepted
time: 0ms
memory: 5700kb
input:
8 1 RRRR
output:
6561
result:
ok single line: '6561'
Test #4:
score: 4
Accepted
time: 0ms
memory: 5716kb
input:
16 1 1*RR0RRRR1RRR0*R
output:
228047430
result:
ok single line: '228047430'
Test #5:
score: 4
Accepted
time: 5ms
memory: 6492kb
input:
32 1 RRRRRRRRR*R0RRR*R*0RRRRRRRRRR1R*1R*
output:
456286566
result:
ok single line: '456286566'
Test #6:
score: 4
Accepted
time: 5ms
memory: 8048kb
input:
32 1 R11RRR*RR1RR0RRRR1RRRR*0R*RRRR1RRRRR1R*RRR
output:
987597859
result:
ok single line: '987597859'
Test #7:
score: 4
Accepted
time: 2ms
memory: 7724kb
input:
16 5 0RRR0 R*RRR RRRRRR RRR1R0R R1*RRRRRRRR1R1RR1RRR
output:
920870788
result:
ok single line: '920870788'
Test #8:
score: 4
Accepted
time: 11ms
memory: 12100kb
input:
32 5 RRRRRRRR1*RRR R1R*0R1R***1RRRRRRRRR**RRRRR01*01RR0R*R*RRR R0RRRRR0RRR0R0RRR0R*RRRR*RR0RR R1RRRRRRRRR*0RRRR1RR10R*RRR1R11RRRR01* 0R0R0RR0R11RRR0RR0RRR**1*RRR1RRRR0*0RR1R
output:
724757213
result:
ok single line: '724757213'
Test #9:
score: 4
Accepted
time: 14ms
memory: 12632kb
input:
32 5 R1*R*RRRRRRRRRRR01R*R0 1R0RRRR1RR1R***RR0R*RR*RRR*1RR 0 1RRRR0RRRRR1R1RRRR0RRR01R*R01 RRRRR1RRRRRR
output:
339267352
result:
ok single line: '339267352'
Test #10:
score: 4
Accepted
time: 10ms
memory: 12112kb
input:
32 5 RRR*0RR*RR1R1*R10RRRRRR1RRRR1 0RR*RRRRR*R*R0 0RRRR*RRR 0R1RRRRR0RRRRR0RRRR**0RRRRRRRRRRRRRRR RRRR01RR0R1R0R*R1RR10RRRRRRRR0RR*R0RRR1R
output:
305204884
result:
ok single line: '305204884'
Test #11:
score: 4
Accepted
time: 4ms
memory: 8236kb
input:
16 1000 RRRRRR1RRRRR*RRR RRR1RR*0RRR1RRR R0RR11RRR*RRRR0R0R R1 RRR1RRRRRR1RRR10* RR*RRR1RRRRRRRR RR RRRRRRRRR*R R* 1RRR*R00* R0R0R*RRRR RRRRR000RR R1R1R1*RRRRRR* RR1*0*1RRRRRR*RRRRRR RR RRRRRRR*R 0RR*RRRRRRRRRRRR10R RRR*RR1RRRR0RRR*0RRRR R*1R1RRRR1RRRRRRR RRRRRRRRR RRRRR*RRRRR RR0RR10RR11R * 0 R1*RR...
output:
278439170
result:
ok single line: '278439170'
Test #12:
score: 4
Accepted
time: 4ms
memory: 8068kb
input:
16 1000 * RRR0R*0RR *RRRRRRR0RRR1RRR1RRR R*RRRRRR11RRRRRRR1R R R0R 0RRRRRR1RRRRR RR**0*R0R 0***R*R*1R 11RRRRRRRRR1RR1 1RR RR1R RRRRR0R*R10RRR1RRR1R RR1R**RR10 1 RRRRRRRR* R1RRRRRRR0R*RR *RR*R1* R0RR RR1R0RR1*RRRRRRRR1 R RRR1RRRR1*RRRRR*RRR* RRR0RRRRR0RR0R1 RRRRRRRRRRRR R R0RR1RRR1RR1 **RRRRRR1*RRRR1...
output:
937144102
result:
ok single line: '937144102'
Test #13:
score: 4
Accepted
time: 18ms
memory: 12908kb
input:
32 1000 0 * 0 1 0 0 * * 0 0 * 1 * 0 1 * 0 0 1 1 1 1 * 0 1 0 0 1 1 * 1 0 0 1 * 0 0 0 * 1 * 0 * 0 * 0 0 * 0 * * 0 0 1 * 0 * 0 0 1 1 * 0 0 * 1 * * * 0 0 1 0 0 * * * 0 0 0 0 * * * 1 1 * 0 * 0 * 0 * 0 1 * * * * 0 1 0 0 * 0 0 * 0 1 * 0 * * 1 1 * 0 * 0 1 0 * 1 * 1 1 1 * 0 1 * * 1 0 1 1 0 0 0 0 0 0 0 1 * 1 ...
output:
675565814
result:
ok single line: '675565814'
Test #14:
score: 4
Accepted
time: 18ms
memory: 12672kb
input:
32 1000 * * 0 * * * 0 0 * 0 * 1 * * 0 0 1 1 1 0 0 * 0 1 0 * * 0 0 1 1 0 * 1 * * 0 0 1 0 * * 0 0 1 0 0 * * * 1 1 1 1 * 1 0 1 1 * 1 * 0 1 * * * * * 0 0 1 1 1 1 0 1 1 0 1 0 * * * * 1 0 1 0 0 1 0 0 1 1 0 1 * * 1 1 0 0 0 1 * 1 * 0 1 0 0 0 * 0 * 0 0 * 0 0 1 1 0 1 0 0 0 1 * 0 0 * 1 1 0 1 * * 1 1 1 0 1 1 1 ...
output:
969266411
result:
ok single line: '969266411'
Test #15:
score: 4
Accepted
time: 10ms
memory: 12160kb
input:
32 1000 1 0 0 1 0 1 0 * 0 1 1 0 0 1 0 1 0 0 1 0 * 0 * * * 0 0 * 0 1 0 0 0 1 0 0 * 0 0 * * * * 0 * 1 * 0 0 1 1 1 1 0 1 * * * 0 * 1 * 0 * 1 * 0 0 1 * * 1 1 * 0 0 1 1 * * 1 * 0 * * * 0 * 0 1 0 * * * 0 1 0 1 0 0 1 * * 0 0 0 0 1 * 1 1 * * 0 0 1 1 1 0 0 * * 1 * 1 * 1 * * * 0 0 0 1 1 1 0 1 0 * 1 * 1 0 0 1 ...
output:
648679786
result:
ok single line: '648679786'
Test #16:
score: 4
Accepted
time: 18ms
memory: 12552kb
input:
32 1000 R1R0RRRRR0R*R1RRRRR** RRR0R0RR*RRRR 1R*RR0R00RRR 0RRRRRRRRRRR R1RRRRRR0RR1RRR1 R0R RRR0RRRRRR**RRR*0RR0 0 R1RR1RRRRR0 RR0*R0RRRRRRR*1RRR R*1*RRR RRRRRRRRRR*1R00RR*0*RR00 RRRR1RRRRR RRR*RRR1RRR*RRR1RRR R0 1RRRRR*R1RRR*R1 RR1RRRRRR R1110*RRRRR***RRRR1RRRR 0*R00R1RR0RRR RRRRR100RR*RRRRR * 0R1RR...
output:
19340709
result:
ok single line: '19340709'
Test #17:
score: 4
Accepted
time: 14ms
memory: 13304kb
input:
32 1000 RR 1*RRRR1R R0R R0R*RRR*RR**R*R*RRR*RR R R0RRRRR101RRR 0RRR1RRRRR 0*R* RRRRRR0RRR1R0RR0R RRRR01R 1R0RRR0RRRRRR R0R1R **1RRRR1 R1R RR1RRRRRR0RRRRRR R*R11RRRR***RR*RRRR RRR1*0RRRR00*R*RRRR1R RRR *R*RRR RRRRRR*RR1RRR1RRRR RRRRR0RRRRRR RR11RR R1RRRRR R00RR1**RRRRRRRR1RRR *RR0RR*R1*RRRRR01*0R* RR...
output:
484551342
result:
ok single line: '484551342'
Test #18:
score: 4
Accepted
time: 11ms
memory: 13524kb
input:
32 1000 1R1RRRR R0*1RRR1RRRRRRRRRR0R0 0RRR RRR0RR*R*RRR 01RRRR0RRRRR*R0RRR*R RR* *RR1RRRRRRR*R RR1RRR**RRRR0RRRR* R**1RRRR0RRR0R1RR1R1RR1 RRRRR*10R RR*1R1RRRRR1RRR RR RRR**1R1RR1 RRR1RR0RR1*1RRRRR*R0R RRR* RRRRR11RR RRRRR1R*RR R1RRRRR**RR 0R*R10*RR1RRR 11R1R*RRR 1RRRRRR0RRRRRR0**RR R*1RRR1R0RRRRR * ...
output:
907694742
result:
ok single line: '907694742'
Test #19:
score: 4
Accepted
time: 18ms
memory: 13248kb
input:
32 1000 RRRRR0RR0RR RRRR*0RR0RRRRR*R0RR RR0 0RR 0RRRRRRRRRR0RRRR1R RRRR RRR R1RRRRR* RR1RRRRR0RR1 0RRR0 RRRR0RRRRRRRRRRR1 RR*RRR1R*R RRR*R*0RRR RRRRR RRRR1RRRR0R0RR*RR R R*11R1*RRRR RR0RRRR0R0RRRR*1R *RR0RR*R*RRR0 RR*R0*R1R1*RR10RR R*R RRRR 0RRRRRRRR RR001RR R1RRRRR* RR** 1RR10R*R RR1RRRRRRRRRRR* RR...
output:
424231090
result:
ok single line: '424231090'
Test #20:
score: 4
Accepted
time: 12ms
memory: 12360kb
input:
32 1000 1RRRRRRR*RR*RRR*R *RR RRRRRRR1RR01R1*R *11RRR0RR*RR1 RRRRR*R1RRRRRRR 1RR **RRRRR RRRRR1R1RR011R *R*RRR*R0*0R1*RRRRRRRR RRRR*RRRRR00RR RRRRRRR0RRRR0RR1*R1 000RRRRR1RR1R RR RRR0RRRRRR00R RRR1RRRRRRR*00RRRR RRRRRRR0R11RR0RR1 1RRRRR0R10RRR0RRR RRRRR0R1*RRR RRR*RRRRR0RRR*R RRRRR1R0RR RRRRR1RRRRRR...
output:
577668630
result:
ok single line: '577668630'
Test #21:
score: 4
Accepted
time: 5ms
memory: 12160kb
input:
32 1000 R0 0 11RR0RR RRRR0RR010000R RRRRRR*RRRRR0R*RRR RRRR RRRRRRRR R*RRRR1*0R R*RR**RRR0 * RRRR1R1*R1RR0RR01RRR0 RR1R0RR*1*RRRR0R*R* RRR*0RR*RR00RRR*RRR1*R 1R*R10RRRRRRR11RR1 RRRRRRRRRR0RR 0RR*R1R11RR*R*RRRR*R RRR *0R11RRR 1*1R R1R1R*0RR0RRR*00RR1RR1RR1 R1**RRRR1R*RRRRRRRR 1 **RRRR1RRRRR1RRR1*R** ...
output:
819220679
result:
ok single line: '819220679'
Test #22:
score: 4
Accepted
time: 7ms
memory: 12328kb
input:
32 1000 R0RRR00*R1R0R0R00RRRR RR*0RRRRRRRRRRRRR*0RRRRRR RRRRRRRRR 0R10RR1RRRR* RRRRRRR1RRRRRRRRR*RR1RRRRR00RRRRRRR R0RRR RRR1RRRRRR1RRR10*RRRRRR RRR*RRRRR*RR0RR RRRR01RRRRR RRR1RRRRRRRRR1R 0RRR1**RRR1R1R1RRRR*1RR1RRRRRRRR1R0RRRR*RRRR*R R*RRR0RRRRR R*RR1RRRRRRRRR*0RR*RR0R*RRRRRR*R1R1RRRR RR0RR*RRR1R0...
output:
691327935
result:
ok single line: '691327935'
Test #23:
score: 4
Accepted
time: 11ms
memory: 13276kb
input:
32 1000 RRRRRR0*RRRRRRR0RRRRRRRRRRRR RRR0*1RRRR0RRRR RRRRR1R 0R0RRR011RRRRRRRR 0RR0RR*RR*RR*RRRRRRRR* 1RR0RRRRRR**0RR1R0**RR0*RRRR*RRR* RRR00RR1RRR**R* R01RRRR11R0*0R1*RRRRRRRR*RR0R0RR*00R*RR0R1RRRRRR* RRR1RRRRRRRR* RRRRRRRRR*1R*RRR1R0R0*0 R1RR01*RRRRRR RR11RRR1R1R**RRRR*1R*RRR R*RRRRRR0RRRRR00R0RRR...
output:
714451377
result:
ok single line: '714451377'
Test #24:
score: 4
Accepted
time: 18ms
memory: 13628kb
input:
32 1000 RRR0R*R0 RRRRRRRR0RRR*R1R*R00R RRRRRRRRRRR0RR1RRRRRR1RRRR*RRRRRRR00RR RRRRR R0RRRRRRRR1 RRRRRRRRRRR1*R*RRRRRRRR RR*RR*RRR1RRRRRR *R*1RR0RRRRRRRRR*R1RRRRRRRRRRR1R10R*R1R 1 RRRR RR11RRRRRRRR1RRRR1RR1RR RRRRRRRRRR*RRRR*RRRRR*11RR*RRR1RRR10RR 0R1RR0R1R*RRRR*RRRR*1R0RRRRR*RR RRRRRRRR *RRRRRRRRRR0...
output:
426645236
result:
ok single line: '426645236'
Test #25:
score: 4
Accepted
time: 19ms
memory: 13196kb
input:
32 1000 1RR1RRRRRR0RRRRRRRRRR RR1*RRRR1RRRRR*R RR*RRRR11R RRR*0*0RR R0*RRRRRRRRRR0RR0R R0RRRRRR1R0RRR1R RRRRRR*R0RRRR00RRRRR0RRRR1RR1RR RRR*RR*R0*RRRR0RR0RRRRRRR*R10RRRR RRRR00* RRRRRRRRRR*R0RR1RRRR RRRRRR1RRR1*0R*R0*RRRRRRR0RRR*R 10*RRRRRRRR1RR0RRRRRRR0RR0RRR RRRR*0R1RR RRRRRR RR0R1RRRRR*RRRRRRRRRR...
output:
780564072
result:
ok single line: '780564072'
Extra Test:
score: 0
Extra Test Passed