对角线
一道数学题,就是纯推式子,式子很快就推出来了,但落了一步强制转换,查了好久。
先看题:
洛谷P2181 对角线
题目描述
对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。
例如,6 边形:
输入格式
输入只有一行一个整数 n,代表边数。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入 #1
3
输出 #1
0
输入 #2
6
输出 #2
15
说明/提示
数据规模与约定
- 对于 50% 的数据,保证 3≤n≤100。
- 对于 100% 的数据,保证 3≤n≤10^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; }