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

B. AND Sequences

题目链接在此

题面截图:

Codeforces Round #714 (Div. 2)_B. AND Sequences_第1张图片

Codeforces Round #714 (Div. 2)_B. AND Sequences_第2张图片

中文题意:

其实就是定义了一个新序列,给你数组问你能排列出几个。
Codeforces Round #714 (Div. 2)_B. AND Sequences_第3张图片

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
const int mod=1e9+7;
const int maxn=2e5+9;
int a[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int tmp=0x3f3f3f3f;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            tmp=tmp>a[i]?a[i]:tmp;
        }
        int cnt=0,flag=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]==tmp)cnt++;
            if((a[i]&tmp)!=tmp)
            {
                flag=1;
                break;
            }
        }
        if(cnt<2||flag)
            //如果最小数个数小于2(无法放到头尾);
            // 或者某个数和最小与后不是最小值都无法组成正确排列
        {
            cout<<"0"<<endl;
            continue;
        }
        int ans=1;
        for (int i = 1; i <=n-2; i++)
        {
            ans=(1LL*ans*i)%mod;
            //除了头尾其余n-2个数全排列
        }
        ans=(1LL*(1LL*cnt*(cnt-1))%mod*ans)%mod;
        cout<<ans<<endl;
    }
}

你可能感兴趣的:(CF加训)