51node 1509
题目
中文题目
思路
http://blog.csdn.net/thy_asdf/article/details/49362035
直接算方案数比较困难,可以先求出不成立的方案数,再拿总方案数去减.
总方案数根据插板法C(l+4-1,4-1)
a+x+b+y<=c+z又x+y+z<=l
得到x+y<=min(c+z-a-b,l-z),枚举z即可,方案数同样可以用插板法
代码
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a,b,c,l,ans;
ll work(ll a,ll b,ll c)
{
ll ret=0;
for(int i=0; i<=l; i++)
{
ll x=min(l-i,c+i-a-b);
if(x>=0) ret+=(x+2)*(x+1)/2;
}
return ret;
}
int main()
{
ans=0;
scanf("%I64d %I64d %I64d %I64d",&a,&b,&c,&l);
ans+=(l+3)*(l+2)*(l+1)/6;
ans-=work(a,b,c),ans-=work(a,c,b),ans-=work(c,b,a);
printf("%I64d\n",ans);
return 0;
}