兔子也是数字控;每个兔子都有自己喜欢的数字区间,找出能让所有兔子都满意的组合。
将所有兔子喜欢的序号按从小到大排序,此时如果小序号的兔子选择了一个数字,则之后的兔子只要排除排在它之前的兔子数(由于已经排过序,减去前面兔子选择的次数就是本兔兔可以做出的选择数,如果为零则意味着没有选择直接输出0)。这样将所有兔子可做的选择数相乘即可得到结果。
注意因为数字过大,取模1e9+7,如果用int(数值范围2147483648)已经超出了,此时数值范围必须要比该模数的平方大,long long(9223372036854775808,即9.223e18)即可满足该要求,所以要注意提升结果精度。
1 //P1866 编号 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 const int MAX=1001; 6 int Rabbit[MAX]; 7 8 int main() 9 { 10 long long n,sum=1; 11 cin>>n; 12 for(int i=0;i<n;i++) 13 { 14 cin>>Rabbit[i]; 15 } 16 sort(Rabbit,Rabbit+n); 17 for(int i=0;i<n;i++) 18 { 19 if(Rabbit[i]<=i) 20 { 21 cout<<0<<endl; 22 return 0; 23 } 24 else sum=(sum*(Rabbit[i]-i))%1000000007; //排序后后者便可以在排除前者已有号码的情况下再进行选择排序,减去的序号数为排前面的兔子总数 25 } 26 27 cout<<sum<<endl; 28 return 0; 29 }