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';

}
posted @ 2025-05-09 09:12  _Yxc  阅读(9)  评论(0)    收藏  举报