1 条题解
-
2
这道题只需要按顺序计算每一个学生拿小球的情况数,然后累乘起来就可以了,其中第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
- 上传者