zoukankan      html  css  js  c++  java
  • 欧拉公式 大组合数 2017 ICPC 乌鲁木齐 D Fence Building

    题目链接:https://nanti.jisuanke.com/t/40515

    题意:给你一个n,让你在圆上找n个点,最多能把圆分成多少个区域。

    欧拉公式:R+V-E=2,其中的R,V,E分别是区域数,点数,边数

    想分成最多的区域,只需要满足不会有3根线交于一个点就好。

    尝试统计总的结点个数A(n),与独立线段(包括圆弧上的n段小弧)的总个数B(n),然后利用欧拉公式就可以得到答案 Ans(n)=B(n)−A(n)+1 这里之所以是加1是因为圆外那个区域我们不算
    任意四个点,会形成一个交点,并贡献额外的 2 条独立线段。而任意两点间也会有一个独立线段

    故A(n)=n+C(n,4),B(n)=n+2*C(n,4) +C(n,2) (这里的C代表组合数)

    故答案为 C(n,4)+C(n,2)+1

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    const long long int mod=1e9+7;
     
    ll mod_pow(ll x, ll n, ll p){ //快速幂 
        ll res = 1;
        while(n){
            if(n & 1) res =res * x % p;
            x = x * x % p;
            n >>= 1;
        }
        return res;
    }
     
    ll comb(ll n, ll m, ll p){ //comb用来求解组合数 
        if(m > n) return 0;
        ll ret = 1;
        m = min(n - m, m);
        for(int i = 1; i <= m; i ++){
            ll a = (n + i - m) % p;
            ll b = i % p;
            ret = ret * (a * mod_pow(b, p - 2, p) % p) % p;
        }
        return ret;
    }
     
    ll Lucas(ll n, ll m, ll p){  //卢卡斯定理---处理大的组合数对素数取模的情况,因为这时如果递推的话将会特别耗时 
        if(m == 0) return 1;
        return comb(n % p, m % p, p) * Lucas(n / p, m / p, p) % p;
    }
     
    int main(){
        int T;
        ll n, m, p;
        scanf("%d", &T);
        int cas=1;
        while(T--){
            scanf("%lld",&n);
            
            long long ans=(Lucas(n,2,mod)+Lucas(n,4,mod)+1)%mod;
            printf("Case #%d: %lld
    ",cas++,ans);
        }
        return 0;
    }
  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/11322175.html
Copyright © 2011-2022 走看看