[LOJ6671] EntropyIncreaser 与 Minecraft

Description

求满足 (sum_{i=1}^n |x_i| le p)((x_1,x_2,...,x_n)) 数目。(n le 10^6)

Solution

枚举 (x_k e 0) 的数目 (i),则有

[sum_{i=0}^n inom n i inom {p-1} {i-1} 2^i =sum_{i=0}^n inom n i 2^i sum_{j=i}^p inom {j-1}{ i-1}=sum_{i=0}^n 2^i inom n iinom p i ]

#include <bits/stdc++.h>
using namespace std;

#define int long long 
const int N = 1000005;
const int mod = 1e9+7;
const int dbg = 1;

int frac[N];

int qpow(int p,int q)
{
    return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;
}

int inv(int p)
{
    return qpow(p,mod-2);
}

int binom(int n,int m)
{
    if(n<m) return 0;
    return frac[n]*inv(frac[m])%mod*inv(frac[n-m])%mod;
}

signed main()
{
    ios::sync_with_stdio(false);

    int n,p;
    cin>>n>>p;

    frac[0]=1;
    for(int i=1;i<=max(n,p);i++)
    {
        frac[i]=frac[i-1]*i%mod;
    }

    int ans=0;

    for(int i=0;i<=n;i++)
    {
        ans+=qpow(2,i)*binom(n,i)%mod*binom(p,i)%mod;
        ans%=mod;
    }

    cout<<ans<<endl;
    if(dbg) system("pause");
}
原文地址:https://www.cnblogs.com/mollnn/p/13692908.html