我觉得自己的思路没问题。。 最开始也是想的DP,后面想想枚举碗的个数再用组合数更容易,而且不可能有重复,但是也只过了40? 看到别的帖子有人发了个代码,他没说自己A了没,但是明显是错的,他在算组合数的时候用了除法,然后还取模。。 上面是我的代码,下面是那个人的代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
int mod = 10000;
int C[55][55];
void init()
{
memset(C,0,sizeof(C));
C[0][0]=1;
for(int i=1; i<=51; i++)
{
C[i][0]=C[i][i]=1;
for(int j=1; j<i; j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
}
int main()
{
int n,m,k;
init();
while(scanf("%d %d %d",&m,&n,&k)!=EOF)
{
int ans=0,ans1=0;
for(int i=1; i<k; i++) ///鱼丸所用碗数量
{
for(int j=1; j+i<=k; j++) ///牛丸所用碗数量
{
if(i>m || j>n)
continue;
ans = ans + C[m-1][i-1] * C[n-1][j-1] %mod;
ans %= mod;
}
}
printf("%d\n",ans);
}
return 0;
}
#include<bits/stdc++.h>
#include<unordered_set>
using namespace std;
int m, n, k;
int mod = 10000;
int main()
{
cin >> m >> n >> k;
if (k == 1)
{
cout << 0 << endl;
return 0;
}
int m1 = min(m, k - 1);
int n1 = min(n, k - 1);
vector<int> num_m(m1+1);
num_m[1] = 1;
for (int i = 2; i <= m1; ++i)
{
num_m[i] = num_m[i - 1] * (m + 1 - i) / (i - 1);
num_m[i] %= mod;
}
vector<int> num_n(n1 + 1);
num_n[1] = 1;
for (int i = 2; i <= n1; ++i)
{
num_n[i] = num_n[i - 1] * (n + 1 - i) / (i - 1);
num_n[i] %= mod;
}
int res = 0;
for (int i = 1; i <=m1; i++)
{
int right = min(k - i, n1);
for (int j = right; j >= 1; j--)
{
res += num_m[i] * num_n[j];
res %= mod;
}
}
cout << res << endl;
return 0;
}