BestCoder Round #71 (div.2) 1002KK's Point

本篇介绍了一个有趣的数学问题:给定圆上N个互不重合的点,两两相连后求图形中交点总数。通过组合数学的方法得出公式C(n,4) + n,并给出了一种避免数据溢出的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:中文题

思路:显然如果要形成一个交点则需要两条线段,对应圆上四个点,则生成交点的数量就是C(n,4)然后加上n即可

Trick:long long会爆...long double也会爆...坑死不少人了...


#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 100000+1000
#define LL long long
int cas=1,T;
unsigned long long c[maxn];


/*unsigned long long com(int n, int r)
{
 // LL c[r+1];
  int i,j;
  for(i=0;i<=r;i++) c[r] = 1LL;
  for(i=1;i<=n-r;i++)
    for(j=1;j<=r;j++)
      c[j]+=c[j-1]; 
  return c[r]; 
}*/
unsigned long long com(int n,int r)
{
	c[0]=1;
	for (int i = 1;i<=n;i++)
		c[i]=c[i-1]*(n-i+1)/i;
	return c[r];
}
int main()
{
	//freopen("in","r",stdin);
	scanf("%d",&T);
	while (T--)
	{
		int n;
		scanf("%d",&n);
        if (n>=4)
		{
            printf("%I64d\n",com(n,4)+n);
		}
		else if (n==2)
		{
            printf("2\n");
		}
		else if (n==3)
		{
			printf("3\n");
		}
		memset(c,0,sizeof(c));
	}
	//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}



KK's Point

 
 Accepts: 48
 
 Submissions: 398
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
我们可爱的KK遇到了一道数学难题:他在一个圆上点下了互不重合的N\left(2\leq N\leq {10}^{5} \right)N(2N105)个点,现在他要将这NN个点两两相连(圆内没有三条线交于一个点的情况),KK想知道图形中一共有多少个交点(包括边界上的点)。
输入描述
第一行一个数T\left( 1\leq T\leq 10\right)T(1T10),表示数据组数。
接着T行,每行一个整数N\left(2\leq N\leq {10}^{5} \right)N(2N105),表示圆上的点数。
输出描述
对于每一个数据输出一个整数,表示交点数。
输入样例
2
3
4
输出样例
3
5


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值