https://www.cometoj.com/contest/59/problem/H?problem_id=2679
思路:最少增量必然确定了是什么数;就是求一段连续序列的方案数;差值就是能选的方案;
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int maxn=1e5+9;
const int mod=1e9+7;
ll a[maxn];
int main()
{
//FAST_IO;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
ll num=a[1];
a[++n]=INF;
ll ans=1;
int st=1;
int ed=1;
for(int i=2;i<=n;i++)
{
if(a[i]<=num)
{
++num;
ed++;
}
else
{
//cout<<num<<endl;
ll tmp=1;
ll k=0;
for(int j=ed;j>=st;j--)
{
tmp=tmp*(num-a[j]-k+1)%mod;
k++;
//cout<<a[j]<<endl;
}
num=a[i];
st=i;
ed=i;
ans=(ans*tmp)%mod;
}
}
cout<<ans<<endl;
return 0;
}