组合数学的一道典题,只得了30分WA,式子推的没问题,求助

P1350 车的放置

改了一下C函数,40分 ```cpp #include <bits/stdc++.h> #define rep(i, a, b) for(int i = (a); i <= (b); i++) #define pre(i, a, b) for(int i = (a); i >= (b); i--) #define Ede(i, u) for(int i = h[u]; i; i = ne[i]) #define go(i, a) for(auto i : a) //#define int long long #define uint unsigned int #define LL long long #define ULL unsigned long long #define PII pair<int, int> #define PIL pair<int, long long> #define PLI pair<long long, int> #define PLL pair<long long, long long> #define mp make_pair #define eb emplace_back #define opb pop_back #define pb push_back #define pf push_front #define fi first #define se second #define sf scanf #define prf printf #define el putchar('\n') #define mms(arr, n) memset(arr, n, sizeof(arr)) #define mmc(arr1, arr2) memcpy(arr1, arr2, sizeof(arr2)) #define Db(x) prf("test(%s): ", x) const int inf = 0x3f3f3f3f; template <typename T> inline void rd(T &x){ x = 0; bool f = true; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = false; ch = getchar();} while(ch >= '0' && ch <= '9'){ x = (x << 1) + (x << 3) + (ch ^ '0'); ch = getchar();} if(!f) x = -x; } template <typename T, typename ...Args> inline void rd(T &x, Args &...args){ rd(x); rd(args...);} using namespace std; const int N = 1010, M = N << 1, mod = 1e5 + 3; int a, b, c, d, k; int fac[M], inv[M]; int qmi(LL a, int k, int p){ int res = 1; for(; k; k >>= 1, a = a * a % p) if(k & 1) res = res * a % p; return res; } void init(){ fac[0] = inv[0] = 1; rep(i, 1, M-1) fac[i] = (LL)fac[i - 1] * i % mod; inv[M-1] = qmi(fac[M-1], mod - 2, mod); pre(i, M-2, 1) inv[i] = (LL)inv[i + 1] * (i + 1) % mod; } int C(int a, int b){ if(b > a) return 0; return (LL)fac[a] * inv[b] * inv[a - b] % mod; } int main(){ /* freopen(".in", "r", stdin); freopen(".out", "w", stdout); */ rd(a, b, c, d, k); init(); LL ans = 0; rep(i, 0, min(c, d)){ ans = ans + C(c, i) * C(d, i) * fac[i] % mod * C(a, k - i) * C(b + d - i, k - i) * fac[k - i] % mod; } prf("%d\n", ans); return 0; } ```
by XSean @ 2023-06-17 10:54:50


50WA,改了一下求ans时的数据类型为longlong ```cpp #include <bits/stdc++.h> #define rep(i, a, b) for(int i = (a); i <= (b); i++) #define pre(i, a, b) for(int i = (a); i >= (b); i--) #define Ede(i, u) for(int i = h[u]; i; i = ne[i]) #define go(i, a) for(auto i : a) //#define int long long #define uint unsigned int #define LL long long #define ULL unsigned long long #define PII pair<int, int> #define PIL pair<int, long long> #define PLI pair<long long, int> #define PLL pair<long long, long long> #define mp make_pair #define eb emplace_back #define opb pop_back #define pb push_back #define pf push_front #define fi first #define se second #define sf scanf #define prf printf #define el putchar('\n') #define mms(arr, n) memset(arr, n, sizeof(arr)) #define mmc(arr1, arr2) memcpy(arr1, arr2, sizeof(arr2)) #define Db(x) prf("test(%s): ", x) const int inf = 0x3f3f3f3f; template <typename T> inline void rd(T &x){ x = 0; bool f = true; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = false; ch = getchar();} while(ch >= '0' && ch <= '9'){ x = (x << 1) + (x << 3) + (ch ^ '0'); ch = getchar();} if(!f) x = -x; } template <typename T, typename ...Args> inline void rd(T &x, Args &...args){ rd(x); rd(args...);} using namespace std; const int N = 1010, M = N << 1, mod = 1e5 + 3; int a, b, c, d, k; int fac[M], inv[M]; int qmi(LL a, int k, int p){ int res = 1; for(; k; k >>= 1, a = a * a % p) if(k & 1) res = res * a % p; return res; } void init(){ fac[0] = inv[0] = 1; rep(i, 1, M-1) fac[i] = (LL)fac[i - 1] * i % mod; inv[M-1] = qmi(fac[M-1], mod - 2, mod); pre(i, M-2, 1) inv[i] = (LL)inv[i + 1] * (i + 1) % mod; } int C(int a, int b){ if(b > a) return 0; return (LL)fac[a] * inv[b] * inv[a - b] % mod; } int main(){ /* freopen(".in", "r", stdin); freopen(".out", "w", stdout); */ rd(a, b, c, d, k); init(); LL ans = 0; rep(i, 0, min(c, d)){ ans = ans + (LL)C(c, i) * C(d, i) * fac[i] % mod * C(a, k - i) * C(b + d - i, k - i) * fac[k - i] % mod; } prf("%d\n", ans); return 0; } ```
by XSean @ 2023-06-17 10:58:18


@[Sean_xzx](/user/546830) 公式错了
by Mini_PEKKA @ 2023-06-17 11:16:09


```cpp C(c, i) * C(d, i) ``` 改为 ```cpp C(c, i) * P(d, i) ```
by Mini_PEKKA @ 2023-06-17 11:16:52


选了列之后每列是不同的,交换了行,因为对应不同的列,所以是不同的方案,所以选行时不能用 C。
by Mini_PEKKA @ 2023-06-17 11:21:24


@[Mini_PEKKA](/user/680197) 但是我后面不是乘了一个fac[i]吗,这个C就相当于是P了
by XSean @ 2023-06-17 11:28:24


没看到 wssb
by Mini_PEKKA @ 2023-06-17 11:43:38


@[Mini_PEKKA](/user/680197) 感觉我写的没啥问题(
by XSean @ 2023-06-17 11:48:50


@[Sean_xzx](/user/546830) 会不会是循环上界的问题。 ```cpp rep(i, 0, min(c, d)){ ``` 改为 ```cpp rep(i, 0, min(k,min(c, d))){ ``` 因为i>k时k-i为负,代入式子中可能会出问题。如inv[-1]。
by Mini_PEKKA @ 2023-06-17 12:25:56


但交了一下还是 50
by Mini_PEKKA @ 2023-06-17 12:28:22


| 下一页