题解:SP13875 JOKER1 - Knifes Are Fun

· · 题解

这道题可以用排列组合的乘法原理,求出每把刀可能的编号数量,然后相乘即可。求每把刀可能的编号数量,可以用这把刀的 \text{maxNumber} 减去已经分配编号的刀的数量再加一。

注意要对 \text{maxNumber} 从小到大排序,让编号范围小的先分配。

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int T,n,a[70];
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+n+1); //先排序,让范围小的编号先分配
        int ans=1;
        for(int i=1;i<=n;i++)
        {
            ans*=max(0,a[i]-i+1); //如果结果小于0,则无解,乘0使结果输出0
            ans%=mod; //记得取模
        }
        cout<<ans<<'\n';
    }
    cout<<"KILL BATMAN"; //结束
    return 0;
}