int n; cin >> n; int all = 0; for (int i = 0; i <= n; i++) { cin >> a[i]; all += a[i]; } if (all == 0) { cout << jc[n] << endl; continue; } int k = all / n; int r = all % n; int ggc = 0; //公共池 int e = 0; for (int i = 1; i <= n; i++) { if (k > a[i]) { ggc += (k - a[i]); } if (a[i] <= k) e++; } if (a[0] < ggc) { cout << 0 << endl; continue; } int M = a[0] - ggc; int ans = 0; int low = max((int) 0, r - (n - e)); int high = min(r, e); for (int x = low; x <= high; x++) { if (x <= M) { ans = (ans + C[e][x] * C[n - e][r - x]) % mod; } } ans = ans * jc[r] % mod * jc[n - r] % mod; cout << ans << endl;
他的代码竟然奇迹般的 AC 了!但我们可以看到他使用的是分别从两堆里面进行选取,逻辑上怎么理解呢,让我们一探究竟。