因为这道题数据过大,所以如果直接用C(m,n)会发生错误,会发生溢出,而且因为除法的存在,求余运算都不能乱用了。
我开始错误的代码:
#include <iostream>
typedef long long ll;
const ll MODE = 1e + 7;
ll C(ll a, ll b)
{
ll res = 1;
for (ll i = 1; i <= b; ++i)
{
res = (res * (a - i + 1) / i );
// res /= i;
std::cout << res << std::endl;
}
// std::cout << res << std::endl;
std::cout << res << std::endl;
return res % MODE;
}
int main()
{
ll r, c;
std::cin >> r >> c;
std::cout << C(r + c - 2, r - 1) << std::endl;
return 0;
}
然后可以用动态规划啊
。嘿嘿
#include <iostream>
typedef long long ll;
const int MAX = 1e3 + 5;
const int MODE = 1e9 +7;
ll dp[MAX];
int main()
{
int n, m;
std::cin >> n >> m;
for (int i = 1; i <= m; ++i)
dp[i] = 1;
for (int i = 2; i <= n; ++i)
{
for (int j = 2; j <= m; ++j)
{
dp[j] = (dp[j] + dp[j - 1]) % MODE;
}
}
std::cout << dp[m] << std::endl;
return 0;
}
dp[i]表示走到第几列的方法。在for循环的过程中,dp[i]表示在第i列的当前行的方法数,dp[i]等于上一列的方法数,加上上一行的方法数,因为在循环的过程中,dp[i]表示的是当前行列交点位置的方法数,就等于dp[i](上一行i列的方法数)+dp[i-1](上一列第i行的方法数相加)。