对于前面 4 个帖子的问题,这里更正一下 SPJ,经过私人题目测试,已验证正确性 .
checker:
#include "testlib.h"
int main(int argc, char* argv[])
{
registerTestlibCmd(argc, argv);
int x = inf.readInt(), k = inf.readInt();
std :: vector<std :: pair<int, int>> v(k);
for (int i=0; i<k; i++){v[i].first = ouf.readInt(); v[i].second = ouf.readInt(); ans.readEoln();}
std :: stable_sort(v.begin(), v.end());
for (int i=0; i<k-1; i++)
if (v[i] == v[i+1]) quitf(_wa, "The answer is wrong (Some binomial numbers are the same).");
const size_t sz = 1e6 + 4;
std :: vector<int> fac(sz), ifac(sz);
auto check = [&](int p) -> bool
{
auto qpow = [&](int a, int n) -> int
{
int ans = 1;
while (n)
{
if (n & 1) ans = 1ll * ans * a % p;
a = 1ll * a * a % p; n >>= 1;
} return ans % p;
};
fac[0] = 1;
for (int i=1; i<p; i++) fac[i] = 1ll * fac[i-1] * i % p;
ifac[p-1] = qpow(p-1, p-2);
for (int i=p-2; i>=0; i--) ifac[i] = 1ll * ifac[i+1] * (i+1) % p;
auto C = [&](int n, int m) -> int {return n < m ? 0 : 1ll * fac[n] * ifac[m] % p * ifac[n-m] % p;};
auto binom = [&](auto&& self, int n, int m) -> int {return (n < p) ? C(n, m) : (n < m) ? 0 : 1ll * C(n % p, m % p) * self(self, n/p, m/p) % p;};
int ans = 0;
for (int i=0; i<k; i++) (ans += binom(binom, v[i].first, v[i].second)) %= p;
return ans % p == x % p;
};
if (!check(2953)) quitf(_wa, "The answer is wrong (The sum of these binomial numbers is not x).");
if (!check(1145141)) quitf(_wa, "The answer is wrong (The sum of these binomial numbers is not x).");
if (!check(1e6+3)) quitf(_wa, "The answer is wrong (The sum of these binomial numbers is not x).");
quitf(_ok, "The answer is correct.");
return 0;
}