hdoj5621KK's Point

来源:互联网 发布:域名交易 知乎 编辑:程序博客网 时间:2024/05/22 02:16

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(2N105) 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(1T10), which indicates the number of test cases.

For each test case, there are one lines,includes a integer N(2N105),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
234
 

Sample Output
35
 

我们先撇开边界上的点不管,那么所有的点都是有两条线所构成的

手算得出N=4的时候,能形成一个点

那么,我们只要知道N个点可以构成几个四边形即可

即求CN4{{C}^{4}_{N}}CN4

最后我们再把边界上的N个点加上,最后的结果是CN4−N{{C}^{4}_{N}}-NCN4 +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;}


0 0