Codeforces Round #714 (Div. 2) B.AND Sequences

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=aa&b=b&aa&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[n1]&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[n1]=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[n1]&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[n1]=a[n]&a[1]&a[2]&a[n1]
这样我们就发现,其实上述等式的值,实际上都是所有数的与起来的值

并且,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(cnt1)(n2)!)

// 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;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值