问题描述
我们可爱的KK遇到了一道数学难题:他在一个圆上点下了互不重合的N(2≤N≤105)个点,现在他要将这N个点两两相连(圆内没有三条线交于一个点的情况),KK想知道图形中一共有多少个交点(包括边界上的点)。
输入描述
第一行一个数T(1≤T≤10),表示数据组数。 接着T行,每行一个整数N(2≤N≤105),表示圆上的点数。
输出描述
对于每一个数据输出一个整数,表示交点数。
输入样例
2 3 4
输出样例
35
这是个数学问题,除了圆上的n个点以外,圆内的任意一个交点对应于圆上的4个点,所以答案就是c(n,4)+n
由于答案很大,会爆longlong,所以还得用unsigned边乘边除
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<iostream> #include<algorithm> #include<bitset> #include<functional> using namespace std; typedef long long LL; typedef unsigned long long ULL; const int maxn = 1e5 + 10; int T, n, m; int main(){ scanf("%d", &T); while (T--) { scanf("%d", &n); printf("%I64u\n", (ULL)n*(n - 1)/2*(n - 2)/3*(n - 3) / 4 + n); } return 0; }