直接DP求组合数即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define LL __int64 using namespace std; LL dp[21][70]; void Init(){ memset(dp,0,sizeof(dp)); dp[0][0]=1ll; for(int i=1;i<21;i++){ for(int j=1;j<70;j++){ if(j-1>=0) dp[i][j]+=dp[i-1][j-1]; if(j-2>=0) dp[i][j]+=dp[i-1][j-2]; if(j-3>=0) dp[i][j]+=dp[i-1][j-3]; } } // int ans=0; // for(int i=0;i<70;i++) // ans+=dp[20][i]; // printf("%d ",ans); } int main(){ Init(); int a,b,t; while(scanf("%d%d%d",&a,&b,&t)!=EOF){ t=t/15; b+=(t/2); LL ans=0; if(b<a){ t=t-t/2; for(int i=0;i<70;i++) ans+=dp[t][i]; } else{ int g=b-a; // cout<<g<<endl; t=t-t/2; // cout<<t<<endl; for(int i=g+1;i<70;i++) ans+=dp[t][i]; } printf("%I64d ",ans); } return 0; }