From 8c657fe81d5241e2861d8e290556233bb35558f1 Mon Sep 17 00:00:00 2001 From: Kirito <1362050620@qq.com> Date: Wed, 12 Oct 2016 21:07:19 +0800 Subject: [PATCH] Create 3565.cpp --- SDUTOJ/3565.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 SDUTOJ/3565.cpp diff --git a/SDUTOJ/3565.cpp b/SDUTOJ/3565.cpp new file mode 100644 index 0000000..4b20df7 --- /dev/null +++ b/SDUTOJ/3565.cpp @@ -0,0 +1,105 @@ +#include +using namespace std; +typedef long long LL; + +int t; +int N1,N2,N3,D1,D2,D3; + +#define MAXN 55 + +/// Left1 Left2 Left3 T.. D.. (T: Fruit of yesterday. D: Day of the last fruit) +LL dp[MAXN][MAXN][MAXN][3][MAXN]; + +#define TOMOD 1000000007 + + +#define return_if_neq(ValToReturn,ValToCmp) do{if(ValToReturn!=ValToCmp) return ValToReturn;}while(0) + +LL dfs(int Left1,int Left2,int Left3,int Type,int Day) +{ + if(Left1<0||Left2<0||Left3<0) return 0; + switch(Type) + { + case 0:if(Day>D1) return 0;else break; + case 1:if(Day>D2) return 0;else break; + case 2:if(Day>D3) return 0;else break; + } + if(Left1==0&&Left2==0&&Left3==0) + { + /// N1,N2,N3: Two of them must be 0, and 1 of them is used directly. + #ifdef __LOCAL__ + dp[Left1][Left2][Left3][Type][Day]=1; + #endif // __LOCAL__ + return 1; + } + if(dp[Left1][Left2][Left3][Type][Day]!=-1) + { + return dp[Left1][Left2][Left3][Type][Day]; + } + LL tmp=0; + LL ta,tb,tc; + switch(Type) + { + case 0: + { + ta=dfs(Left1-1,Left2,Left3,0,Day+1)%TOMOD; + tb=dfs(Left1,Left2-1,Left3,1,1)%TOMOD; + tc=dfs(Left1,Left2,Left3-1,2,1)%TOMOD; + tmp=(ta+tb+tc)%TOMOD; + break; + } + case 1: + { + ta=dfs(Left1-1,Left2,Left3,0,1)%TOMOD; + tb=dfs(Left1,Left2-1,Left3,1,Day+1)%TOMOD; + tc=dfs(Left1,Left2,Left3-1,2,1)%TOMOD; + tmp=(ta+tb+tc)%TOMOD; + break; + } + case 2: + { + ta=dfs(Left1-1,Left2,Left3,0,1)%TOMOD; + tb=dfs(Left1,Left2-1,Left3,1,1)%TOMOD; + tc=dfs(Left1,Left2,Left3-1,2,Day+1)%TOMOD; + tmp=(ta+tb+tc)%TOMOD; + break; + } + } + return dp[Left1][Left2][Left3][Type][Day]=tmp; +} +//#define __LOCAL__ +int main() +{ + scanf("%d",&t); + while(t--) + { + scanf("%d %d %d %d %d %d",&N1,&N2,&N3,&D1,&D2,&D3); + memset(dp,-1,sizeof(dp)); + LL ta=dfs(N1-1,N2,N3,0,1)%TOMOD; + LL tb=dfs(N1,N2-1,N3,1,1)%TOMOD; + LL tc=dfs(N1,N2,N3-1,2,1)%TOMOD; + LL ans=(ta+tb+tc)%TOMOD; + #ifdef __LOCAL__ + printf("%I64d\n",ans); + for(int i=0;i