爱奇艺2018秋招C++ [编程题]奶牛编号

链接: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 就通过了。

猜你喜欢

转载自blog.csdn.net/dlwsd_/article/details/83903323