B. AND Sequences
https://codeforces.com/problemset/problem/1513/B
题意:给定长度为n的序列a,问a有多少种排列组合,是满足条件的?条件:对于当前的排列中所有的下标i∈[1, n - 1],从a[1]&a[2]&...&a[i] == a[i + 1] & ...&a[n]。
思路:前面的&运算与后面的&运算结果相等,说明这个结果是a中所有数&运算的值f。题目要求对于每个下标i都符合这个条件,那么这个排列中,第一个和最后一个数必须是f,对于其他位置,我们可以任意排列。所以最终的结果是fcnt * (fcnt - 1) * (n - 2)!,前两个相乘表示第一个位置和最后一个位置选f的排列方式数,n - 2的阶乘表示其他位置的排列组合方式数。
总结:第一天看没有思路,第二天再看就秒了,哎,感觉活得好像有延迟。
inline void solve() {
int n;
cin >> n;
vector<int> a(n);
long long f = (1ll << 55) - 1;
for (auto& x : a) {
cin >> x;
f &= x;
}
MInt cnt = 0;
for (auto x : a) {
cnt += (x == f);
}
auto cal = [&]() {
MInt res = 1;
int t = n - 2;
while (t > 0) {
res *= t;
t --;
}
res = res * cnt * (cnt - 1);
return res;
};
cout << (cal()) << '\n';
}

浙公网安备 33010602011771号