https://www.51nod.com/Challenge/Problem.html#!#problemId=1509
正向考虑半天没结果 看题解是反向。。 组合数还是太弱
还是用挡板法 挡板法就是将n个相同元素分为k份 任意一份都可以为空 此时如果直接插板子的话 同一个位置插很多板子时没法处理顺序问题 所以将问题转换一下 变为将(n+k)个相同元素分为k份 任意一份都至少有一个元素 这样就避免了同一个地方要插很多板子的问题 即C(n+k-1,k-1)
首先考虑总方案数 为C(l+4-1,4-1) 代表将l分为四份 去掉一份后分给三角形的三边
再考虑不合格的方案数 由a+x+b+y<=c+z与x+y+z<=l联立的x+y<=min(c-a-b+z,l-z) 此时将x+y取最大值 并分为三份后去掉一份 分给两个短边 即C(x+y+3-1,3-1)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll solve(ll a,ll b,ll c,ll l)
{
ll res,xy,z;
res=0;
for(z=l;z>=0;z--){
xy=min(c-a-b+z,l-z);
if(xy>=0){
res+=(xy+2)*(xy+1)/2ll;
}
}
return res;
}
int main()
{
ll a,b,c,l,ans;
scanf("%lld%lld%lld%lld",&a,&b,&c,&l);
ans=(l+3)*(l+2)*(l+1)/6ll-solve(a,b,c,l)-solve(a,c,b,l)-solve(b,c,a,l);
printf("%lld\n",ans);
return 0;
}