奶牛编号

题目描述

牛牛养了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
解题思路:直接是乘法原则的思路,你第一个选择了那个数第二个就不能选择,即(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;
}
 
不一样的烟火
原文地址:https://www.cnblogs.com/cstdio1/p/11043942.html