兔子也是数字控;每个兔子都有自己喜欢的数字区间,找出能让所有兔子都满意的组合。

  将所有兔子喜欢的序号按从小到大排序,此时如果小序号的兔子选择了一个数字,则之后的兔子只要排除排在它之前的兔子数(由于已经排过序,减去前面兔子选择的次数就是本兔兔可以做出的选择数,如果为零则意味着没有选择直接输出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 }

 

posted on 2019-04-02 00:43  tobyte  阅读(233)  评论(0编辑  收藏  举报