0
点赞
收藏
分享

微信扫一扫

加长棒 51Nod - 1509

书坊尚 2022-06-16 阅读 136

​​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;
}

 


举报

相关推荐

0 条评论