愛奇藝2018秋招C++ [程式設計題]奶牛編號
阿新 • • 發佈:2018-11-11
連結: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 就通過了。