1 条题解

  • 2
    @ 2024-2-22 15:08:42

    这道题只需要按顺序计算每一个学生拿小球的情况数,然后累乘起来就可以了,其中第i个学生拿时候,还剩(n+1-i)*m个小球,选择其中的m个小球,方案数是C((n+1-i)*m.m)

    参考代码
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int P = 1e9+7;
    long long m, n ,fact[1000005], inv[1000005], finv[1000005], p[1000005],ans;
    long long C(long long a,long long b)
    {
    	return fact[a] * finv[b] % P * finv[a - b] % P ;
     } 
    int main()
    {
        cin >> n >> m;
        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;
        }
       ans=1;
      	for(int i=n;i>=1;i--)
      	{
      		ans=ans*C(i*m,m)%P;
    	  }
    	cout<<ans;
    }
    
    • 1

    信息

    ID
    671
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    (无)
    递交数
    61
    已通过
    47
    上传者