题目描述
牛牛养了n只奶牛,牛牛想给每只奶牛编号,这样就可以轻而易举地分辨它们了。 每个奶牛对于数字都有自己的喜好,第i只奶牛想要一个1和x[i]之间的整数(其中包含1和x[i])。
牛牛需要满足所有奶牛的喜好,请帮助牛牛计算牛牛有多少种给奶牛编号的方法,输出符合要求的编号方法总数。
牛牛需要满足所有奶牛的喜好,请帮助牛牛计算牛牛有多少种给奶牛编号的方法,输出符合要求的编号方法总数。
输入描述:
输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示奶牛的数量 第二行为n个整数x[i](1 ≤ x[i] ≤ 1000)
输出描述:
输出一个整数,表示牛牛在满足所有奶牛的喜好上编号的方法数。因为答案可能很大,输出方法数对1,000,000,007的模。
示例1
输出
复制24
解题思路:直接是乘法原则的思路,你第一个选择了那个数第二个就不能选择,即(n-0)*(n-1)*(n-2)*....(n-(数组长度-1));
注意:1.前提必须是排好序的数组否则会出现负数
2.还有就是取模的时候注意*和%优先级问题
#include <iostream> #include <cmath> #include <algorithm> #include <set> #include <cstdio> #include <string> #include <cstring> /*@author:浅滩 *family: *time: */ //我好像是一个在海边玩耍的孩子, //不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞, //而展现在我面前的是完全未探明的真理之海 using namespace std; const long long mod=1e9+7; int main() { long long num,i,j; cin>>num; long long arr[num]; long long cnt[num]; for(i=0;i<num;i++) cin>>arr[i]; sort(arr,arr+num);//不排序存在一个问题cnt[i]有可能出现负数 int t=0;//第一次没有排序导致错误 for(j=0;j<num;j++)//可以不用cnt数组 { cnt[j]=arr[j]-t; t++; } long long s=1; for(i=0;i<num;i++) s=(s*cnt[i])%mod;//注意不能写成s*=cnt%mod; //可以写成s=(s*(arr[i]-i))%mod;可以节约内存空间 cout<<s; //cout << "Hello world!" << endl; return 0; }