codeforces 571A-Lengthening Sticks(结合+容斥)
codeforces 571A--Lengthening Sticks(组合+容斥)
题目链接:点击打开链接
题目大意:给出三条边的长度,可以给任意一条边增加任意的长度,但是增加的长度的总和不能超过l,问有多少种增加的方法,可使得三条边任然能组成一个三角形。
用总的方法数-不能组成三角形的方法数
首先求出所有的能增加的方法,如果三条边增加的长度和是l,那么一共有C(l+2,2)种,计算出从0到l的所有的方法。
然后计算不能组成三角形的方法,如果最长边>=另外两边之和,那么就不是三角形,所以分别枚举a+i,b+i,c+i为最长边,然后计算有多少种不可能的办法。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define LL __int64 LL sum[300100] ; LL solve(int a,int b,int c,int l) { if( a < b+c ) return (LL)0 ; LL ans = min(a-b-c,l) ; return (ans+1)*(ans+2)/2 ; } int main() { int a , b , c , l ; LL i , ans ; while( scanf("%d %d %d %d", &a, &b, &c, &l) != EOF ) { sum[0] = 1 ; for(i = 1 ; i <= l ; i++) { sum[i] = (i+1)*(i+2)/2 + sum[i-1] ; } ans = sum[l] ; for(i = 0 ; i <= l ; i++) { ans -= solve(a+i,b,c,l-i) ; ans -= solve(b+i,a,c,l-i) ; ans -= solve(c+i,a,b,l-i) ; } printf("%I64d\n", ans) ; } return 0 ; }
版权声明:转载请注明出处:http://blog.****.net/winddreams