转自:http://blog.csdn.net/aclion/article/details/8703623
#include <cstdio>
#include <cstring>
int A, B, t;
int tA, tB, round, dp[30][100];
void init() {
memset( dp, 0, sizeof(dp) );
dp[1][1] = dp[1][2] = dp[1][3] = 1; //这个初始化,很简单
for ( int i = 2; i <= 20; ++i )
for ( int j = 1;j <= 60; ++j ) { //对于每场比赛,可能得1,2,或3分,j是第i场比赛之前包括第i场得到的分数
if ( j > 1 ) dp[i][j] += dp[i-1][j-1]; //如果在本场比赛中得一分,那么它之前的状态就是前一场比赛得j-1分的状态,那么有dp[i-1][j-1]有多少种,那么dp[i][j]里面就应该包括多少种
if ( j > 2 ) dp[i][j] += dp[i-1][j-2]; //和上一个类似,就是如果得分是2分,那么之前的状态就是前一场得j-2分的状态,那么这些种数也包括在dp[i][j] 里面
if ( j > 3 ) dp[i][j] += dp[i-1][j-3]; //同上
}
}
int main()
{
init();
while ( scanf("%d%d%d", &A, &B, &t) == 3 ) {
round = t / 15;
tA = (round+1) / 2;
tB = round - tA;
if ( round == 0 ) { //这个状态不能忘了
if ( A > B ) printf("1\n");
else printf("0\n");
continue;
}
B += tB;
int tmp = B - A + 1;
if ( tmp < 0 ) tmp = 0; //这个情况一定要考虑到,如果B远小于A的话,就是负数,如果没有这一步,后面一定错
long long ans = 0;
for ( int i = tmp; i <= 60; i++ ) ans += dp[tA][i]; //这个就是在进行tA场比赛后,得分满足要求的状态的和,即>=tmp得分
printf("%I64d\n", ans);
}
}