求区域的个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuxiaowu547/article/details/81913755

【1】圆上有n个点,两两相连,问有多少个区域;
首先在圆上去n个点,要是n个点产生的区域数最大,就必须是任意3条直线不交于一点。也就是圆内任意一点最多只有两条直线经过。在圆上的n个点会连出C(n,2)条直线。任意一个圆内交点都可以有圆上四点构成的四元组唯一对应,那么无序四元组的个数为C(n,4),也是交点个数。
如果把圆看成一张图(圆弧也是边),点数有n+C(n,4),边数有C(n,2)+2C(n,4)+n;
根据欧拉公式有F=E-V+2=C(n,4)+C(n,2)+2,扣掉圆外区域,答案为C(n,4)+C(n,2)+1。
代码:

#include <bits/stdc++.h>
using namespace std;

long long Mod = 1e9 + 7;

long long int QPow(long long int a,long long int x){
    if(x == 0){return 1;}
    if(x == 1){return a;}
    long long int ans = QPow(a,x / 2);
    if(x % 2 == 0){return ans * ans % Mod;}
    return ans * ans % Mod * a % Mod;
}

int main(){
    int T,k = 1;
    scanf("%d",&T);
    while(T --){
        long long N;
        scanf("%lld",&N);
        if(N <= 2){printf("Case #%d: %lld\n",k,N);k ++;continue;}
        long long a = N % Mod;
        long long b = (N - 1) % Mod;
        long long c = (N - 2) % Mod;
        long long d = (N - 3) % Mod;
        long long t1 = a * b % Mod * c % Mod * d % Mod;
        long long t2 = QPow(24,Mod - 2);
        long long ans = t1 * t2 % Mod;
        long long t3 = a * b % Mod;
        long long t4 = QPow(2,Mod - 2);
        ans = ans + (t3 * t4 % Mod);
        ans %= Mod;
        ans += 1;
        ans = (ans + Mod) % Mod;
        printf("Case #%d: %lld\n",k,ans);
        k ++;
    }

    return 0;
}

【2】给出一个正多边形,求每两个顶点相连的区域个数;
oeis的公式;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1000000007;
ll ma;
ll pow(ll n,int m)
{
    ll ans=1;
    while(m)
    {
        if(m&1)
        {
            ans=(ans*n)%mod;
        }
        m>>=1;
        n=(n*n)%mod;
    }
    return ans%mod;
}
ll pan(ll n)
{
    ll ans=(((pow(n,4)-6*pow(n,3)%mod+mod)%mod)+(23*pow(n,2)-42*n%mod+mod)%mod+24)%mod;
    return (ans*ma)%mod;
}
int main()
{
    ll n;
    ma=pow((ll)24,mod-2);
    while(~scanf("%lld",&n))
    {
        printf("%lld\n",pan(n));
    }
}

猜你喜欢

转载自blog.csdn.net/wuxiaowu547/article/details/81913755