【TOJ 5276】圆内交点

描述

现在有一个很大的圆,圆周上有N个互不重合的点,让这N个点两两连线,问连线有多少条,这些连线在圆的内部有多少个交点。

输入

多组输入,每行输入一个数字表示N(1 ≤ N ≤ 100); 

输出

输出两个数字,第一个数字表示连线的条数,第二个数字表示园内交点的个数。 

样例输入

2
4

样例输出

1 0
6 1

#include<bits/stdc++.h>
double lncom(int n,int m)     //在c语言中,log函数也就是我们通常所说的ln函数,即以e为底的对数函数
{
    double s1=0,s2=0,i;       //s1=n!/m!  s2=1/(n-m)!

    if(m<n/2.0)m=n-m;         //如果上标小于下标的一半,此时m<n-m,令m=n-m,使计算更加快捷

    for(i=m+1;i<=n;i++)       //s1作为分子,从m+1累乘至n
    s1=s1+log(i);

    for(i=2;i<=n-m;i++)       //s2作为分母,从1累乘至n-m
    s2=s2+log(i);

    return s1-s2;
}
double com(int n,int m)
{
    if(n<m)return 0;          //因为n≥m,所以这种情况不存在

    return exp(lncom(n,m));   //把经过处理的组合数还原出来
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==1)
            printf("0 0\n");
        else if(n==2)
            printf("1 0\n");
        else if(n==3)
            printf("3 0\n");
        else printf("%.0f %.0f\n",com(n,2),com(n,4));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kannyi/p/9051459.html