zoukankan      html  css  js  c++  java
  • P1866 编号

    大致题意:

    • 求太郎的n只兔子的编号的排列种数

    基本思路:

    • 每只兔子都有一个范围,那么每只兔子的范围就是这只兔子选择编号的种数。
    • 以5 8为例,第一只兔子有5种,第二只兔子有8种,而第一只兔子选择后,第二只兔子就剩下了7种,那么一共就有5*7=35种方法。
    • 是不是想到了什么?
    • 再来看一个题: 有1,2,3,4,5五个数,把他们组成不同的3位数有几种方法?5*(5-1)*(5-2)=60(种)
    • 乘法原理!
    • 到这里,我们的代码就可以写出来了。

    注:不用判断不可能的情况,先看个例子:

    2
    1 1
    

    这一定是不可能的,在代码里执行的结果是1*0=0,所以如果有不可能的情况的话,就一定有"乘以0",所以不用判断不可能的情况

    Code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <list>
    using namespace std;
    #define R read()
    #define GC getchar()
    #define ll long long
    #define ull unsigned long long
    #define INF 0x7fffffff
    #define LLINF 0x7fffffffffffffff
    #define MOD 1000000007
    ll read(){
        ll s=0,f=1;
        char c=GC;
        while(c<'0'||c>'9'){if(c=='-')f=-f;c=GC;}
        while(c>='0'&&c<='9'){s=s*10+c-'0';c=GC;}
        return s*f;
    }
    int n;
    int m[60];
    ll ans=1;
    int main(){
        n=R;
        for(int i=1;i<=n;++i){
            m[i]=R;
        }
        sort(m+1,m+n+1);//先排序
        for(int i=1;i<=n;++i){
            ans=ans*(m[i]-i+1)%MOD;//乘法原理
        }
        printf("%d",ans%MOD);//输出
        return 0;
    }
    
  • 相关阅读:
    HDU3085 Nightmare Ⅱ (双向BFS)
    LuoguP2523 [HAOI2011]Problem c(概率DP)
    BZOJ4569 [Scoi2016]萌萌哒(并查集,倍增)
    CF360E Levko and Game(贪心)
    总结-小技巧
    总结-二分
    总结-莫队
    $P1821 [USACO07FEB]银牛派对Silver Cow Party$
    $P2126 Mzc家中的男家丁$
    $P5017 摆渡车$
  • 原文地址:https://www.cnblogs.com/FUXyao/p/12848760.html
Copyright © 2011-2022 走看看