链接:https://www.nowcoder.com/questionTerminal/b96da2bd7a574699b4ceaaa7819cf65b 来源:牛客网
牛牛养了n只奶牛, 牛牛想给每只奶牛编号, 这样就可以轻而易举地分辨它们了。 每个奶牛对于数字都有自己的喜好, 第i只奶牛想要一个1和x[i]之间的整数(其中包含1和x[i])。
牛牛需要满足所有奶牛的喜好, 请帮助牛牛计算牛牛有多少种给奶牛编号的方法, 输出符合要求的编号方法总数。
输入描述 :
输入包括两行, 第一行一个整数n(1 ≤ n ≤ 50), 表示奶牛的数量 第二行为n个整数x[i](1 ≤ x[i] ≤ 1000)
输出描述 :
输出一个整数, 表示牛牛在满足所有奶牛的喜好上编号的方法数。因为答案可能很大, 输出方法数对1, 000, 000, 007的模。
示例1
输入
4
4 4 4 4
输出
24
解题思路:因为编号不能重复,为了保证每一个奶牛都能被编号,需要对X[i]从小到大排序。举例:若有两个奶牛,假设X[1]=2, x[2]=1。当给第一个奶牛编号为2时,第二个奶牛可以编号为1。当给第一个奶牛编号为1时,第二个奶牛无法编号。所以应该从最小的X[i]开始编号。从小到大排序后,第一个奶牛有X[0]种选择,第i个奶牛有X[i]-i种选择,相乘取模得到结果。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<long long>vec(n, 0);
for (int i = 0; i < n; i++) {
cin >> vec[i];
}
sort(vec.begin(),vec.end());
long long max=vec[0];
long long temp = 0;
for (int i = 1; i < n; i++) {
temp = 1L*(vec[i] - i);
max = 1L*max*temp % 1000000007;
}
max = max % 1000000007;
cout << max;
return 0;
}
注意:刚开始max定义的类型为int,遇到较大的数相乘之后,结果溢出,参考了博客https://blog.csdn.net/bine_/article/details/46413613 ,将int换成long long 就通过了。