enumclassBoxCase{kEqualBalls,kEqualDistantBalls};classSolution{public:doublegetProbability(vector<int>&balls){constintn=accumulate(balls.begin(),balls.end(),0)/2;returncases(balls,0,0,0,0,0,n,BoxCase::kEqualDistantBalls)/cases(balls,0,0,0,0,0,n,BoxCase::kEqualBalls);}private:constvector<int>fact{1,1,2,6,24,120,720};// Assume we have two boxes A and B.doublecases(constvector<int>&balls,inti,intballsCountA,intballsCountB,intcolorsCountA,intcolorsCountB,intn,BoxCaseboxCase){if(ballsCountA>n||ballsCountB>n)return0;if(i==balls.size())returnboxCase==BoxCase::kEqualBalls?1:colorsCountA==colorsCountB;doubleans=0;// balls taken from A for `balls[i]`for(intballsTakenA=0;ballsTakenA<=balls[i];++ballsTakenA){constintballsTakenB=balls[i]-ballsTakenA;constintnewcolorsCountA=colorsCountA+(ballsTakenA>0);constintnewcolorsCountB=colorsCountB+(ballsTakenB>0);ans+=cases(balls,i+1,ballsCountA+ballsTakenA,ballsCountB+ballsTakenB,newcolorsCountA,newcolorsCountB,n,boxCase)/(fact[ballsTakenA]*fact[ballsTakenB]);}returnans;}};
enumBoxCase{EQUAL_BALLS,EQUAL_DISTANT_BALLS}classSolution{publicdoublegetProbability(int[]balls){finalintn=Arrays.stream(balls).sum()/2;returncases(balls,0,0,0,0,0,n,BoxCase.EQUAL_DISTANT_BALLS)/cases(balls,0,0,0,0,0,n,BoxCase.EQUAL_BALLS);}privateint[]fact={1,1,2,6,24,120,720};// Assume we have two boxes A and B.doublecases(int[]balls,inti,intballsCountA,intballsCountB,intcolorsCountA,intcolorsCountB,intn,BoxCaseboxCase){if(ballsCountA>n||ballsCountB>n)return0;if(i==balls.length)returnboxCase==BoxCase.EQUAL_BALLS?1:(colorsCountA==colorsCountB?1:0);doubleans=0;// balls taken from A for `balls[i]`for(intballsTakenA=0;ballsTakenA<=balls[i];++ballsTakenA){finalintballsTakenB=balls[i]-ballsTakenA;finalintnewcolorsCountA=colorsCountA+(ballsTakenA>0?1:0);finalintnewcolorsCountB=colorsCountB+(ballsTakenB>0?1:0);ans+=cases(balls,i+1,ballsCountA+ballsTakenA,ballsCountB+ballsTakenB,newcolorsCountA,newcolorsCountB,n,boxCase)/(fact[ballsTakenA]*fact[ballsTakenB]);}returnans;}}
fromenumimportEnumclassBoxCase(Enum):EQUAL_DISTANT_BALLS=0EQUAL_BALLS=1classSolution:defgetProbability(self,balls:list[int])->float:n=sum(balls)//2fact=[1,1,2,6,24,120,720]defcases(i:int,ballsCountA:int,ballsCountB:int,colorsCountA:int,colorsCountB,boxCase:BoxCase)->float:ifballsCountA>norballsCountB>n:return0ifi==len(balls):return(1ifboxCase==BoxCase.EQUAL_BALLSelsecolorsCountA==colorsCountB)ans=0.0# balls taken from A for `balls[i]`forballsTakenAinrange(balls[i]+1):ballsTakenB=balls[i]-ballsTakenAnewcolorsCountA=colorsCountA+(ballsTakenA>0)newcolorsCountB=colorsCountB+(ballsTakenB>0)ans+=(cases(i+1,ballsCountA+ballsTakenA,ballsCountB+ballsTakenB,newcolorsCountA,newcolorsCountB,boxCase)/(fact[ballsTakenA]*fact[ballsTakenB]))returnansreturn(cases(0,0,0,0,0,BoxCase.EQUAL_DISTANT_BALLS)/cases(0,0,0,0,0,BoxCase.EQUAL_BALLS))
Thanks for stopping by! If you find this site helpful, consider buying me some protein powder to keep me fueled! π