1 条题解

  • 1
    @ 2024-2-22 16:42:17

    和作业类似,可以先每个人分配a[i]-1个,这样每个人还需要分配的数量变为1个,之后就是标准的隔板法了~

    参考代码
    
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int P = 1e9+7;
    long long x, y, k, fact[1000005], inv[1000005], finv[1000005], p[1000005],a[1005];
    int main()
    {
        cin >> x >> y ;
        long long sum=0;
        for(int i=1;i<=y;i++)
        {
        	cin>>a[i];
        	sum+=a[i];
    	}
        fact[0] = 1;
        for (int i = 1; i <= 1000000; i++)
            fact[i] = fact[i - 1] * i % P;
        finv[0] = finv[1] = inv[1] = 1;
        for (int i = 2; i <= 1000000; i++)
        {
            int k = P / i, r = P % i;
            inv[i] = ((-1 * k * inv[r] % P) + P) % P;
            finv[i] = finv[i - 1] * inv[i] % P;
        }
        x = x - sum + y;
        if (x < 0)
            cout << 0;
        else
            cout << fact[x - 1] * finv[y - 1] % P * finv[x - y] % P  << endl;
    

    }

    • 1

    信息

    ID
    673
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    (无)
    递交数
    87
    已通过
    46
    上传者