zoukankan      html  css  js  c++  java
  • 2017乌鲁木齐区域赛D题Fence Building-平面图的欧拉公式

    这个题B站上面有这题很完整的分析和证明,你实在不懂,可以看看这个视频

     https://www.bilibili.com/video/av19849697?share_medium=android&share_source=qq&bbid=00561DA9-126A-4190-88A8-2B9DD5DAFEB512211infoc&ts=1533979978895 
     
    视频里面讲的很清楚,我再重复一下把,就是说,给N个圆上的点,在这个圆内部会产生多少个点呢?,很简单C(N,4);为什么???因为园内任意四个点,可以连线组成一个内部点,再加上N个外围点,总共有N+C(n,4)个点,我们再来算有多少边,首先我们可以想,这些内部点一定不是端点,我可以考虑一下,一个不是端点的点,可以把线段分成多少部分呢???答案是2*C(N,4),然后我们把圆的外围弧,也变成线,那么就完美的用平面图的欧拉公式解决:
    设G为任意的连通的平面图,则v-e+f=2,v是G的顶点数,e是G的边数,f是G的面数。
    再把最外面的区域减去就行。
    这里一定要注意取模的问题,由于N变态到离谱,我们不能对N有任何的操作,首先出来就必须把N%MOD,否则就会炸范围
    这里你仔细一看,就发现,公式化简成为ans=C(n,2)+C(n,4)+1;处理一下逆元就好了
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const ll mod = 1e9+7;
    ll qpow(ll a,ll b)
    {
        ll ans=1;
        while(b)
        {
            if (b&1)ans=(ans*a)%mod;
            a=(a*a)%mod;
            b>>=1;
        }
        return ans;
    }
    int main()
    {
        int t;
        ll n;
        int cas=0;
        scanf("%d",&t);
        while(t--){
     
          scanf("%lld",&n);
          ll ans=(1+(((n%mod)*((n-1)%mod)%mod*qpow(2,mod-2))%mod)%mod+(((((n%mod)*((n-1)%mod))%mod*((n-2)%mod))%mod*((n-3)%mod))%mod*qpow(24,mod-2)%mod)%mod)%mod;
          printf("Case #%d: %lld
    ",++cas,ans);
     
        }
        return 0;
    }
    有不懂欢迎咨询 QQ:1326487164(添加时记得备注)
  • 相关阅读:
    wx小程序用canvas生成图片流程与注意事项
    mysql导入导出csv
    机房测速
    python 后台服务
    python获取硬件信息模块
    nagios外部命令接口
    nginx下的nagios pnp4nagios
    supervisor运行virtualenv环境下的nagios-api
    check_mk通用应用检测插件
    pnp4nagios 性能调优
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/9515334.html
Copyright © 2011-2022 走看看