Divide by Zero 2021 and Codeforces Round #714 (Div. 2)
B(超详细)
首先我们明白几个性质
a
&
b
<
=
m
i
n
(
a
,
b
)
①
a
&
a
=
a
②
a
&
b
=
b
&
a
③
a
&
a
&
a
&
a
&
a
=
a
④
a \& b <= min(a, b)① \\ a \& a = a ②\\ a \& b = b\&a③ \\ a\&a\&a\&a\&a = a④
a&b<=min(a,b)①a&a=a②a&b=b&a③a&a&a&a&a=a④
根据题意,我们要找一个全排列,使得任意分隔开后,他们分隔开的两半,每一半与起来的值都相等,这就是一个合法的答案
那么,根据题意
a[1] = a[2] &…&a[n]
根据性质3推出来
a[1] = a[2] &…&a[n]&a[1]
由性质1,我们可以得到
a[1] <= a[n]
同理,a[1]&a[2] &…&a[n - 1] = a[n]
得到a[n] <= a[1]
那么a[1] = a[n]
我们多写几步:
a
[
1
]
=
a
[
2
]
&
a
[
3
]
⋯
&
a
[
n
−
1
]
&
a
[
n
]
a
[
1
]
&
a
[
2
]
=
a
[
3
]
&
a
[
4
]
⋯
&
a
[
n
]
a
[
1
]
&
a
[
2
]
&
a
[
3
]
=
a
[
4
]
⋯
&
a
[
n
]
.
.
.
.
.
.
a
[
1
]
&
a
[
2
]
⋯
&
a
[
n
−
1
]
=
a
[
n
]
\begin{array}{lcl} a[1] = a[2] \& a[3] \cdots \& a[n - 1] \& a[n] \\ a[1] \& a[2] = a[3] \& a[4] \cdots \& a[n] \\ a[1] \& a[2] \& a[3] = a[4] \cdots \& a[n] \\ ...... \\ a[1] \& a[2] \cdots \& a[n - 1] = a[n] \end{array}
a[1]=a[2]&a[3]⋯&a[n−1]&a[n]a[1]&a[2]=a[3]&a[4]⋯&a[n]a[1]&a[2]&a[3]=a[4]⋯&a[n]......a[1]&a[2]⋯&a[n−1]=a[n]
那么我们根据性质2和4,对所有的等式的右边与上他等号的左边,这显然是成立的
a
[
1
]
=
a
[
2
]
&
a
[
3
]
⋯
&
a
[
n
−
1
]
&
a
[
n
]
&
a
[
1
]
a
[
1
]
&
a
[
2
]
=
a
[
3
]
&
a
[
4
]
⋯
&
a
[
n
]
&
a
[
1
]
&
a
[
2
]
a
[
1
]
&
a
[
2
]
&
a
[
3
]
=
a
[
4
]
⋯
&
a
[
n
]
&
a
[
1
]
&
a
[
2
]
&
a
[
3
]
.
.
.
.
.
.
a
[
1
]
&
a
[
2
]
⋯
&
a
[
n
−
1
]
=
a
[
n
]
&
a
[
1
]
&
a
[
2
]
⋯
&
a
[
n
−
1
]
\begin{array}{lcl} a[1] = a[2] \& a[3] \cdots \& a[n - 1] \& a[n] \& a[1]\\ a[1] \& a[2] = a[3] \& a[4] \cdots \& a[n] \& a[1] \& a[2]\\ a[1] \& a[2] \& a[3] = a[4] \cdots \& a[n] \& a[1] \& a[2] \& a[3]\\ ...... \\ a[1] \& a[2] \cdots \& a[n - 1] = a[n] \& a[1] \& a[2] \cdots \& a[n - 1] \end{array}
a[1]=a[2]&a[3]⋯&a[n−1]&a[n]&a[1]a[1]&a[2]=a[3]&a[4]⋯&a[n]&a[1]&a[2]a[1]&a[2]&a[3]=a[4]⋯&a[n]&a[1]&a[2]&a[3]......a[1]&a[2]⋯&a[n−1]=a[n]&a[1]&a[2]⋯&a[n−1]
这样我们就发现,其实上述等式的值,实际上都是所有数的与起来的值
并且,a[1] 是等于该值的
同理,让所有的等式的左边与上他等号的右边,就能推出来:a[n]是等于该值的,也就是所有数的与起来的值
并且a不论数列怎么分隔,a[1]和a[n]一定是放在两端的
那么这样来看,中间的数放什么其实是无所谓的,我们只要找到两个数,与他们所有的数的与值相等即可,这样就能保证左边与起来的数和右边与起来的数是相等的了
如果不把这两个数放在两端,那么肯定连第一个等式都满足不了(读者可根据上面的等式左右两边操作来证明
所以说答案就是在与起来相等的数的个数大于等于2的前提下, ( c n t ⋅ ( c n t − 1 ) ⋅ ( n − 2 ) ! ) (cnt⋅(cnt−1)⋅(n−2)!)%(109+7)(cnt⋅(cnt−1)⋅(n−2)!)%(109+7). (cnt⋅(cnt−1)⋅(n−2)!)
// Problem: B. AND Sequences
// Contest: Codeforces - Divide by Zero 2021 and Codeforces Round #714 (Div. 2)
// URL: https://codeforces.com/contest/1513/problem/B
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
#define ll long long
#define re return
using namespace std;
typedef pair<int, int> PII;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int a[200000 + 10];
int T;
int n;
const int MOD = 1e9 + 7;
ll A(int a){
ll ans = 1;
for(int i = 1; i <= a; i++){
ans *= i;
ans %= MOD;
}
return ans;
}
int main(){
cin >> T;
while(T--){
cin >> n;
for(int i = 1; i <= n; i++){
scanf("%d",a + i);
}
int x = a[1];
for(int i = 2; i <= n; i++) x &= a[i];
ll cnt = 0;
for(int i = 1; i <= n; i++){
if(x == a[i]) cnt++;
}
if(cnt < 2) cout << 0 << endl;
else{
cnt %= MOD;
cnt = cnt * (cnt - 1) % MOD;
ll ans = 1ll * cnt * A(n - 2) % MOD;
cout << ans << endl;
}
}
re 0;
}