首页 > 技术文章 > 对角线

z-2-we 2022-03-13 19:31 原文

一道数学题,就是纯推式子,式子很快就推出来了,但落了一步强制转换,查了好久。

先看题:

洛谷P2181 对角线

题目描述

对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。

例如,6 边形:

输入格式

输入只有一行一个整数 n,代表边数。

输出格式

输出一行一个整数代表答案。

输入输出样例

输入 #1
3
输出 #1
0
输入 #2
6
输出 #2
15

说明/提示

数据规模与约定

  • 对于 50% 的数据,保证 3n100。
  • 对于 100% 的数据,保证 3n10^5。

式子很好推,先看n边形的一个顶点向外延伸的对角线和其他对角线的交点,其他对角线中能与这些对角线有(n-3)个交点的有一条,有(n-4)个交点的有两条……以此类推,而有n个顶点,但每四个顶点又有一个交点为同一个,式子是((n-3)*1+(n-4)*2+(n-5)*3+……+(n-k)*(k-2)+……+1*(n-3))*n/4  (k<n)。

式子推完了,但是有一个问题,数很大,会爆long long,要用unsigned long long,这里就要注意一点,枚举k求(n-k)*(k-2)时需要强制转换成unsigned long long。

下面是代码:

#include<iostream>
using namespace std;
unsigned long long n;
unsigned long long ans=0;
int main(){
    cin>>n;
    for(int i=n-3,j=1;i>=1;i--,j++){
        ans+=(unsigned long long)i*j;
    }
    cout<<ans*n/4;
    return 0;
}

 

推荐阅读