KK's Point
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 503 Accepted Submission(s): 171
Problem Description
Our lovely KK has a difficult mathematical problem:He points
N(2≤N≤105)
points on a circle,there are all different.Now he's going to connect the
N
points with each other(There are no three lines in the circle to hand over a point.).KK wants to know how many points are there in the picture(Including the dots of boundary).
Input
The first line of the input file contains an integer
T(1≤T≤10)
, which indicates the number of test cases.
For each test case, there are one lines,includes a integer N(2≤N≤105) ,indicating the number of dots of the polygon.
For each test case, there are one lines,includes a integer N(2≤N≤105) ,indicating the number of dots of the polygon.
Output
For each test case, there are one lines,includes a integer,indicating the number of the dots.
Sample Input
2 3 4
Sample Output
3 5
我们先撇开边界上的点不管,那么所有的点都是有两条线所构成的
手算得出N=4的时候,能形成一个点
那么,我们只要知道N个点可以构成几个四边形即可
即求CN4
最后我们再把边界上的N个点加上,最后的结果是CN4 +N
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<list>
#include<queue>
#include<vector>
using namespace std;
const int maxn=100010;
long long C[maxn][5];
void init(){
for(int i=0;i<maxn;++i){
C[i][0]=1;
}
for(int i=1;i<maxn;++i){
for(int j=1;j<=4;++j){
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
}
}
int main()
{
int t;
long long n;
init();
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
if(n<=3){
printf("%lld\n",n);
}
else {
printf("%lld\n",C[n][4]+n);
}
}
return 0;
}