题目地址:Link to here
据说这道题可以用动态规划来写但是我不会2333
解题思路:
首先,我们可以考虑用f[i]来表示当前用了长度为i时的方案数。。
但是根本行不通qwq。所以因该运用补集的思想来转化一下。当总长度为k的时候,很明显总方案数是C(n-1,3)就是在n-1个点中选出3个点来切;然后考虑不合法的情况即当最长边长度大于总长度的一半。我们可以枚举不合法的最长边长度然后再次运用排列组合的方法来求解,即C(n-1-t,2),其中t是枚举的长度。这里容易忽略一个条件就是枚举出来的那条边可以插在求解出的情况的中间或两边,所以应该减去4*C(n-1-t,2)即可。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long n;
int main(){
//freopen("quad.in","r",stdin);
//freopen("quad.out","w",stdout);
scanf("%lld",&n);
long long ans=(n-1)*(n-2)*(n-3)/6;
long long temp=0;
long long mod=n%2;
for(int i=(n/2)+mod;i<=n-3;i++)
ans-=(n-i-1)*(n-i-2)*2;
printf("%lld",ans);
return 0;
}