1. 程式人生 > >愛奇藝2018秋招C++ [程式設計題]奶牛編號

愛奇藝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 就通過了。