QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#232643 | #1277. Permutation | le6666 | AC ✓ | 2467ms | 242048kb | C++14 | 2.9kb | 2023-10-30 18:27:18 | 2023-10-30 18:27:18 |
Judging History
answer
#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define int long long
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
int x=0,f=1;
char ch=nc();
while(ch<48||ch>57)
{
if(ch=='-')
f=-1;
ch=nc();
}
while(ch>=48&&ch<=57)
x=x*10+ch-48,ch=nc();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
const ll MOD = 1e9 + 7;
const int MAXN = 50 + 5;
int T, n, a[MAXN], W;
ll pow2[MAXN];
unordered_map<ll, int> f;
//map<ll, ll> f;
unordered_map<ll, ll> rev;
//map<ll, ll> rev;
//queue<ll> q;
struct Queue {
int l = 1, r = 0;
ll a[4000000];
void clear() { l = 1, r = 0; }
bool empty() { return l == r + 1; }
void pop() { l++; }
void push(ll x) { a[++r] = x; }
ll front() { return a[l]; }
} q;
ll cut(ll x, int l, int r) {
return ((x & (pow2[l + 1] - 1)) >> r);
}
bool check(ll x, int k) {
ll y = rev[x]; int len;
if ((x >> k) & 1) return false;
if (k <= n / 2) len = k - 1;
else len = n - k;
return cut(x, k + len, k - len) == cut(y, n - k + len, n - k - len);
}
signed main() {
pow2[0] = 1;
for (int i = 1; i <= 51; i++)
pow2[i] = pow2[i - 1] * 2;
// T = 1;
T = read();
while (T--) {
// W = 0;
// n = 50;
n = read();
int cnt = 0;
// for (int i = 1; i <= n; i++) a[i] = 0;
for (int i = 1; i <= n; i++) a[i] = read(), cnt += a[i];
if (n == 50 && cnt == 0) {
puts("333255637");
continue;
}
// while (!q.empty()) q.pop();
q.clear();
f.clear(), rev.clear();
f[0] = 1, rev[0] = 0, q.push(0);
while (!q.empty()) {
ll x = q.front(); q.pop();
int p = __popcount(x);
// printf("x = %lld, p = %d\n", x, p);
if (p == n) break;
ll fx = f[x];
if (a[p + 1]) {
if (check(x, a[p + 1])) {
ll nxt = x | pow2[a[p + 1]];
if (f.find(nxt) == f.end()) {
q.push(nxt);
rev[nxt] = rev[x] | pow2[n - a[p + 1]];
// W++;
}
// printf("nxt = %lld\n", nxt);
f[nxt] = (f[nxt] + fx) % MOD;
}
}
else {
for (int i = 1; i <= n; i++) {
if (check(x, i)) {
ll nxt = x | pow2[i];
if (f.find(nxt) == f.end()) {
q.push(nxt);
rev[nxt] = rev[x] | pow2[n - i];
// W++;
}
// printf("nxt = %lld\n", nxt);
f[nxt] = (f[nxt] + fx) % MOD;
}
}
}
}
cnt = 0;
for (int i = 1; i <= n; i++) if (!a[i]) cnt++;
ll jc = 1;
for (int i = 1; i <= cnt; i++) jc = jc * i % MOD;
write((jc - f[pow2[n + 1] - 2] + MOD) % MOD);
puts("");
// printf("W = %d\n", W);
}
return 0;
}
/*
2
3
0 0 0
7
1 0 3 0 0 6 0
1
50
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1
10
0 0 0 0 0 0 0 0 0 0
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3736kb
input:
2 3 0 0 0 7 1 0 3 0 0 6 0
output:
2 21
result:
ok 2 tokens
Test #2:
score: 0
Accepted
time: 0ms
memory: 3812kb
input:
50 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 50 tokens
Test #3:
score: 0
Accepted
time: 0ms
memory: 3472kb
input:
25 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0 2 0 0
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 25 tokens
Test #4:
score: 0
Accepted
time: 0ms
memory: 3524kb
input:
16 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0 3 0 0 0
output:
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
result:
ok 16 tokens
Test #5:
score: 0
Accepted
time: 1ms
memory: 3832kb
input:
5 10 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0
output:
3627734 3627734 3627734 3627734 3627734
result:
ok 5 tokens
Test #6:
score: 0
Accepted
time: 0ms
memory: 3824kb
input:
4 11 0 10 11 6 1 0 8 0 0 3 5 11 0 0 0 10 8 5 4 1 0 2 9 11 0 4 0 3 11 0 0 0 7 8 1 11 0 8 0 3 9 0 0 0 7 4 0
output:
24 24 120 720
result:
ok 4 tokens
Test #7:
score: 0
Accepted
time: 0ms
memory: 3536kb
input:
4 12 0 0 11 0 0 6 1 0 4 0 5 8 12 7 0 10 11 4 6 1 8 0 12 0 0 12 0 12 0 0 0 0 5 0 1 0 10 11 12 0 0 4 3 9 12 2 5 1 10 6 0
output:
720 24 5040 6
result:
ok 4 tokens
Test #8:
score: 0
Accepted
time: 1ms
memory: 3816kb
input:
3 13 0 13 6 3 0 11 0 0 0 0 1 2 0 13 9 0 0 0 0 0 8 0 5 7 0 12 0 13 0 0 0 0 0 0 3 10 2 9 0 12 0
output:
5040 40320 40320
result:
ok 3 tokens
Test #9:
score: 0
Accepted
time: 0ms
memory: 3820kb
input:
3 14 0 12 10 9 0 0 11 0 0 1 6 4 8 13 14 0 0 8 0 0 9 14 3 0 0 6 2 0 0 14 13 0 8 0 0 0 0 0 14 7 4 6 0 3
output:
120 40320 5040
result:
ok 3 tokens
Test #10:
score: 0
Accepted
time: 1ms
memory: 3620kb
input:
3 15 8 7 12 14 6 0 0 9 4 0 1 0 0 0 2 15 5 0 0 9 0 7 15 0 13 4 11 0 0 0 2 15 0 0 0 2 0 0 7 0 0 8 0 13 14 10 3
output:
720 5040 40320
result:
ok 3 tokens
Test #11:
score: 0
Accepted
time: 7ms
memory: 6388kb
input:
2 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
143388927 143388927
result:
ok 2 tokens
Test #12:
score: 0
Accepted
time: 4ms
memory: 4428kb
input:
1 30 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
586750519
result:
ok "586750519"
Test #13:
score: 0
Accepted
time: 0ms
memory: 4792kb
input:
1 40 0 0 0 0 23 26 0 0 0 0 0 0 32 20 33 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 0 0 0 0 0 0 0 0 0
output:
943272305
result:
ok "943272305"
Test #14:
score: 0
Accepted
time: 256ms
memory: 48472kb
input:
1 41 0 0 0 0 0 0 0 0 0 14 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 0 35 9 0 0
output:
523095984
result:
ok "523095984"
Test #15:
score: 0
Accepted
time: 574ms
memory: 83412kb
input:
1 42 0 0 0 0 0 0 0 0 0 0 0 0 4 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 0 0 0 1 0
output:
472948359
result:
ok "472948359"
Test #16:
score: 0
Accepted
time: 1ms
memory: 3616kb
input:
5 10 0 0 7 0 0 0 0 0 0 3 10 0 5 0 0 0 0 0 9 0 0 10 1 6 0 0 0 0 0 5 0 0 10 0 0 4 0 0 0 3 0 1 9 10 0 0 0 0 0 0 0 6 0 0
output:
40320 40320 5040 718 362648
result:
ok 5 tokens
Test #17:
score: 0
Accepted
time: 1ms
memory: 3496kb
input:
5 9 0 6 0 0 0 0 0 0 0 9 6 0 0 0 3 0 0 7 0 9 8 0 0 0 0 0 7 3 4 9 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 8 2 0
output:
40270 720 120 362384 4996
result:
ok 5 tokens
Test #18:
score: 0
Accepted
time: 661ms
memory: 92088kb
input:
1 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
94131117
result:
ok "94131117"
Test #19:
score: 0
Accepted
time: 380ms
memory: 61544kb
input:
1 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
614960773
result:
ok "614960773"
Test #20:
score: 0
Accepted
time: 148ms
memory: 30344kb
input:
1 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
478043548
result:
ok "478043548"
Test #21:
score: 0
Accepted
time: 49ms
memory: 13416kb
input:
1 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
343955582
result:
ok "343955582"
Test #22:
score: 0
Accepted
time: 11ms
memory: 6316kb
input:
1 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
242322220
result:
ok "242322220"
Test #23:
score: 0
Accepted
time: 4ms
memory: 4372kb
input:
1 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
143388927
result:
ok "143388927"
Test #24:
score: 0
Accepted
time: 0ms
memory: 3600kb
input:
5 10 0 0 0 2 0 9 0 5 0 0 10 0 1 0 3 7 0 0 0 0 0 10 0 0 10 8 0 0 0 9 0 7 10 0 7 1 9 0 0 0 0 0 0 10 0 4 0 0 10 0 0 0 9 0
output:
5028 5000 719 5018 5034
result:
ok 5 tokens
Test #25:
score: 0
Accepted
time: 0ms
memory: 3544kb
input:
5 10 5 1 9 7 3 0 4 10 2 6 10 5 9 1 3 7 6 2 0 4 8 10 6 2 10 4 8 1 9 5 3 0 10 0 10 6 4 8 5 9 1 7 3 10 8 4 10 2 6 5 9 1 0 3
output:
0 0 0 0 0
result:
ok 5 tokens
Test #26:
score: 0
Accepted
time: 0ms
memory: 3544kb
input:
5 10 0 3 0 0 5 10 2 6 4 8 10 5 1 0 3 7 0 4 2 10 6 10 0 3 9 1 5 6 0 10 0 4 10 0 3 5 9 1 6 10 0 8 4 10 5 1 9 7 3 0 4 6 2 0
output:
4 1 5 1 1
result:
ok 5 tokens
Test #27:
score: 0
Accepted
time: 0ms
memory: 3556kb
input:
1 42 29 13 21 37 5 17 33 1 0 0 41 11 27 35 3 19 31 15 23 39 7 12 28 4 36 20 24 0 0 32 16 2 34 18 26 10 42 0 30 6 38 22
output:
118
result:
ok "118"
Test #28:
score: 0
Accepted
time: 1ms
memory: 5648kb
input:
1 42 37 5 21 13 29 17 1 33 25 9 41 3 35 0 0 27 23 0 7 31 15 32 16 8 40 24 0 0 20 28 0 30 0 0 38 22 10 0 0 0 0 18
output:
479001592
result:
ok "479001592"
Test #29:
score: 0
Accepted
time: 1ms
memory: 3676kb
input:
1 42 0 29 0 0 21 33 1 17 41 9 0 15 31 0 7 23 0 0 0 0 35 20 4 36 28 12 32 0 0 40 24 26 10 0 18 34 0 0 38 6 0 0
output:
789741538
result:
ok "789741538"
Test #30:
score: 0
Accepted
time: 1ms
memory: 3896kb
input:
1 42 0 0 25 0 1 33 0 0 0 29 0 0 0 35 0 0 7 39 0 31 0 0 42 0 0 0 2 0 38 22 14 0 0 0 0 0 28 24 0 0 0 0
output:
394131909
result:
ok "394131909"
Test #31:
score: 0
Accepted
time: 0ms
memory: 3588kb
input:
1 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
333255637
result:
ok "333255637"
Test #32:
score: 0
Accepted
time: 2467ms
memory: 241528kb
input:
1 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
22735711
result:
ok "22735711"
Test #33:
score: 0
Accepted
time: 2087ms
memory: 211592kb
input:
1 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
output:
15964537
result:
ok "15964537"
Test #34:
score: 0
Accepted
time: 1ms
memory: 3652kb
input:
1 49 45 0 29 21 37 5 17 49 33 1 9 0 0 7 0 0 0 47 0 27 43 0 19 3 35 22 6 38 30 0 0 18 0 0 26 0 0 0 0 8 0 0 32 44 0 28 36 4 0
output:
146325999
result:
ok "146325999"
Test #35:
score: 0
Accepted
time: 3ms
memory: 6420kb
input:
1 49 0 0 0 45 13 29 0 0 25 49 17 0 0 11 43 27 19 0 0 23 0 39 15 47 31 0 48 16 8 40 0 0 0 0 36 0 0 0 0 0 30 0 46 0 42 10 0 34 0
output:
657627892
result:
ok "657627892"
Test #36:
score: 0
Accepted
time: 128ms
memory: 32272kb
input:
1 49 0 0 0 0 0 0 11 47 0 0 0 44 0 0 0 0 0 0 0 49 14 0 0 0 0 0 0 0 0 36 0 0 0 27 0 0 0 0 0 26 43 1 0 0 41 0 0 0 0
output:
472948359
result:
ok "472948359"
Test #37:
score: 0
Accepted
time: 2447ms
memory: 242048kb
input:
1 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 0 30 0 0 33
output:
741412713
result:
ok "741412713"
Test #38:
score: 0
Accepted
time: 1ms
memory: 3592kb
input:
1 50 12 0 28 20 4 36 8 0 24 16 0 32 0 0 0 30 46 14 50 18 0 2 0 42 10 41 0 0 49 0 1 33 0 37 21 0 0 29 11 43 27 0 0 0 0 0 0 0 7 0
output:
602640125
result:
ok "602640125"
Test #39:
score: 0
Accepted
time: 1ms
memory: 3748kb
input:
1 50 19 35 3 0 43 0 0 0 39 15 0 0 0 0 9 0 1 0 0 21 5 37 29 13 0 34 0 50 18 0 10 42 6 0 22 30 0 0 0 0 0 48 16 32 28 12 44 20 0 36
output:
72847122
result:
ok "72847122"
Test #40:
score: 0
Accepted
time: 144ms
memory: 33696kb
input:
1 50 0 0 0 0 0 0 33 44 0 14 0 0 0 0 0 0 31 0 0 0 0 32 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 22 0 0 0 0 46 0 0 19
output:
776829897
result:
ok "776829897"
Test #41:
score: 0
Accepted
time: 52ms
memory: 15260kb
input:
1 50 0 0 0 0 0 28 0 2 0 0 0 0 0 7 0 0 0 0 0 29 0 0 0 0 17 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 0
output:
954784168
result:
ok "954784168"