1. 程式人生 > >UVALive-8079 Making a Team 排列組合公式化簡

UVALive-8079 Making a Team 排列組合公式化簡

for 復雜度 href submit 復雜 body \n cpp making

題目鏈接:https://cn.vjudge.net/problem/UVALive-8079

題意

n個人組隊,隊伍人數小於等於n,每個隊伍需要4個不同的職務的領導。
問這n個人可以組成多少隊?
n<=1e7

思路

很明顯,對一個i人隊伍,可以組成$ \sum\binom{i}{1}^4\binom{n}{i} = \sum i^4\binom{n}{i} $種可能。
現在分析一下復雜度,對一個n來講我們可以求逆元來求組合數,所以O(n)復雜度。
那麽現在又有1000行的數據,總的復雜度遠遠超過了10s的時間。
又要優化了,這次看了半天沒有優化思路,賽後有人講把整個式子拆開即可,反正我是拆不開。
這次用用某同學的方法優化。
\[ \begin{align*} 1+\sum_1^n \binom{n}{i}x^i&=(1+x)^n \\ (1+\sum_1^n \binom{n}{i}x^i)‘&=((1+x)^n)‘ \\ \sum_1^n i\binom{n}{i}x^{i-1}&=n(1+x)^{n-1} \\ \sum_1^n i\binom{n}{i}x^i&=n(1+x)^{n-1}x \\ \sum_1^n i^2\binom{n}{i}x^i&=n(n-1)(1+x)^{n-2}x^2+n(1+x)^{n-1}x \\ \sum_1^n i^3\binom{n}{i}x^i&=n(n-1)(n-2)(1+x)^{n-3}x^3+2n(n-1)(1+x)^{n-2}x^2+ n(n-1)(1+x)^{n-2}x^2+n(1+x)^{n-1}x \\ \sum_1^n i^4\binom{n}{i}x^i&=2^{n-4}(n^4+20n^3-55n^2+42n) \end{align*} \]


這個思路可以應對$ \sum f(i) \binom{n}{i} $形式的化簡,其中f(i)是i的多項乘積。

提交過程

TLE

AC

代碼

#include <cstdio>
#include <cstring>
const int maxn=1e7+20;
const int mod=1e8+7;
int pow2[maxn];
void init(void){
    pow2[0]=1;
    for (int i=1; i<maxn; i++)
        pow2[i]=(pow2[i-1]*2)%mod;
    // printf("done\n");
}

long long pow(long long x, int num){
    long long res=1;
    for (int i=0; i<num; i++) 
        res=(res*x)%mod;
    return res;
}

long long func(int n){
    if (n==1) return 1;
    if (n==2) return 18;
    if (n==3) return 132;
    return ((pow2[n-4]*(pow(n, 4) + 6*pow(n, 3) + 3*pow(n, 2) - 2*n )%mod)%mod+mod)%mod;
}

int main(void){
    long long n;

    init();
    while (scanf("%lld", &n)==1 && n)
        printf("%lld\n", func(n));

    return 0;
}
Time Memory Length Lang Submitted
66ms None 682 C++ 5.3.0 2018-08-24 23:14:22

UVALive-8079 Making a Team 排列組合公式化簡