P2181 对角线

https://www.luogu.com.cn/problem/P2181

注意事项:高精,会超出int、long long的范围,需要使用 unsigned long long
思路:n边形,先看每个点能够发出多少条对角线:n-3 (不能和自己、边上两个点连接)
再看每条对角线有多少个交点,从第一条线开始,
第一条线:左边1个点,右边n-2-1个点,交点数 1 * n-2-1
第二条线:左边2个点,右边n-2-2个点,交点数 1 * n-2-1
第i条线:左边i个点,右边n-2-i个点,交点数 i * n-2-i

累加,即可得到每个点发出的对角线的交点总数。
然后所有点都是相同的计算方式。
最后再去重,每个交点涉及到两条线,4个点。
因此总数=累加结果*n/4
 

#include 
using namespace std;

int main()
{
    int n;
    cin >> n;
    unsigned long long iRet = 0;
    for (long long i = 1; i <= n-3; i++)
    {
        long long tmp = i * (n-i-2);
        iRet += tmp;
    }
    iRet = iRet * n / 4;
    cout << iRet << endl;
    return 0;
}

 

你可能感兴趣的:(洛谷)