QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#232619 | #1277. Permutation | le6666 | TL | 2313ms | 128936kb | C++14 | 4.5kb | 2023-10-30 17:43:14 | 2023-10-30 17:43:14 |
Judging History
answer
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2")
#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, ll> 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();
// for (int i = 1; i <= n; i++) a[i] = 0;
for (int i = 1; i <= n; i++) a[i] = read();
// 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;
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] + f[x]) % 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] + f[x]) % MOD;
}
}
}
}
int 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
*/
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3700kb
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: 3648kb
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: 3644kb
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: 3704kb
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: 0ms
memory: 5800kb
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: 5644kb
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: 3584kb
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: 3628kb
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: 3712kb
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: 3808kb
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: 28ms
memory: 5040kb
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: 12ms
memory: 4948kb
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: 18ms
memory: 5924kb
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: 960ms
memory: 67264kb
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: 1874ms
memory: 110240kb
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: 3688kb
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: 3672kb
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: 2313ms
memory: 128936kb
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: 1594ms
memory: 94052kb
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: 649ms
memory: 44436kb
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: 215ms
memory: 18508kb
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: 69ms
memory: 8792kb
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: 13ms
memory: 5044kb
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: 1ms
memory: 3656kb
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: 3704kb
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: 3644kb
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: 3652kb
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: 0ms
memory: 3660kb
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: 3868kb
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: 3ms
memory: 4068kb
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: -100
Time Limit Exceeded
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