zoukankan      html  css  js  c++  java
  • 【51nod】1309 Value of all Permutations

    题解

    可重元素的全排列都是很熟知的东西了
    就是
    (frac{n!}{prod c_{i}!})其中(c_{i})是第i种数出现的次数

    我们对于每个元素统计一下多少排列里这个数会被统计进去

    我们对于一个M,如果a里面大于M的数有k个,那么每个被统计进的元素和这些数都不相同,被统计进的元素需要出现在所有不合法的数之前,概率是(frac{1}{k + 1})

    设a里小于等于M的元素和为S,排列个数为P
    答案是(Scdot frac{P}{k + 1})

    代码

    #include <bits/stdc++.h>
    //#define ivorysi
    #define enter putchar('
    ')
    #define space putchar(' ')
    #define fi first
    #define se second
    #define pb push_back
    #define mp make_pair
    #define eps 1e-8
    #define mo 974711
    #define MAXN 50005
    #define pii pair<int,int>
    using namespace std;
    typedef long long int64;
    typedef double db;
    template<class T>
    void read(T &res) {
        res = 0;char c = getchar();T f = 1;
        while(c < '0' || c > '9') {
    	if(c == '-') f = -1;
    	c = getchar();
        }
        while(c >= '0' && c <= '9') {
    	res = res * 10 + c - '0';
    	c = getchar();
        }
        res *= f;
    }
    template<class T>
    void out(T x) {
        if(x < 0) {putchar('-');x = -x;}
        if(x >= 10) {
    	out(x / 10);
        }
        putchar('0' + x % 10);
    }
    const int MOD = 1000000007;
    int N,Q;
    int a[MAXN],inv[MAXN],fac[MAXN],invfac[MAXN],P,s[MAXN];
    int mul(int a,int b) {
        return 1LL * a * b % MOD;
    }
    int inc(int a,int b) {
        a = a + b;
        if(a >= MOD) a -= MOD;
        return a;
    }
    void Init() {
        read(N);read(Q);
        for(int i = 1 ; i <= N ; ++i) read(a[i]);
        sort(a + 1,a + N + 1);
        for(int i = 1 ; i <= N ; ++i) {
    	s[i] = inc(s[i - 1],a[i]);
        }
        fac[0] = 1;
        for(int i = 1 ; i <= N ; ++i) fac[i] = mul(fac[i - 1],i);
        inv[1] = 1;inv[0] = 1;
        for(int i = 2 ; i <= N ; ++i) inv[i] = mul(inv[MOD % i],MOD - MOD / i);
        invfac[0] = 1;
        for(int i = 1 ; i <= N ; ++i) invfac[i] = mul(invfac[i - 1],inv[i]);
        P = fac[N];
        int c = 0;
        for(int i = 1 ; i <= N ; ++i) {
    	if(a[i] != a[i - 1]) {
    	    P = mul(P,invfac[c]);
    	    c = 0;
    	}
    	++c;
        }
        P = mul(P,invfac[c]);
    }
    void Solve() {
        int M;
        while(Q--) {
    	read(M);
    	int t = M > a[N] ? N + 1 : lower_bound(a + 1,a + N + 1,M + 1) - a;
    	int res = mul(P,s[t - 1]);
    	t = N - t + 1;
    	res = mul(res,inv[t + 1]);
    	out(res);enter;
        }
    }
    int main() {
    #ifdef ivorysi
        freopen("f1.in","r",stdin);
    #endif
        Init();
        Solve();
        return 0;
    }
    

    为什么我刷不动题啊……今天做的题好少……可能昨天太颓了……qwq
    即将老年的debuff要生效了啊。。。

  • 相关阅读:
    【贪心+前缀】C. Fountains
    优雅降级和渐进增强
    px和em
    src与href
    css 浮动
    CSS权重及样式优先级问题
    css样式初始化
    品字布局设计
    CSS3新特性
    inline-block的简单理解
  • 原文地址:https://www.cnblogs.com/ivorysi/p/9168502.html
Copyright © 2011-2022 走看看