题面:有一张二维棋盘,骑士每次可以从(i,j)移到(i+1,j+2)或(i+2,j+1)。求骑士从位置(0,0)移到(X,Y)的路径方案数?结果对1E9+7取模。
范围:1 <= X,Y <= 1E6
分析:dp的时间复杂度为O(XY),会TLE,因此考虑数学方法。假设走法1用了A次,走法2用了B次,那么有A+2B=X,并且2A+B=Y,可以算出A和B,答案就是C(A+B,A)。
#include <bits/stdc++.h>
// mint模板略
mint comb(int n, int k) {
mint r = 1;
for (int i = 1; i <= k; i++) r *= n - i + 1;
for (int i = 1; i <= k; i++) r /= i;
return r;
}
void solve() {
int X, Y;
std::cin >> X >> Y;
if (2 * X < Y || (2 * X - Y) % 3 != 0) {
std::cout << 0 << "\n";
return;
}
if (2 * Y < X || (2 * Y - X) % 3 != 0) {
std::cout << 0 << "\n";
return;
}
int A = (2 * X - Y) / 3;
int B = (2 * Y - X) / 3;
std::cout << comb(A + B, A) << "\n";
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}
标签:组合数学