欧拉公式 大组合数 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\n",cas++,ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/qingjiuling/p/11322175.html

时间: 2024-11-13 20:31:36

欧拉公式 大组合数 2017 ICPC 乌鲁木齐 D Fence Building的相关文章

2017 ICPC乌鲁木齐 A Coins 概率dp

Coins 题意:一开始所有n个硬币都是反面朝上的,每次必须拿k个来抛,抛的人足够聪明,问m次之后向上的硬币的期望. 首先说了这个足够聪明的意思,就是只要向反面的有k个就不会sb地去拿向正面的来抛,想了一会之后就觉得是个概率dp的转移, 然而一开始想漏了个组合数的加权,但在+1的提醒下搞通了,但是分析了下,这是nmk的时间复杂度, 1e6还有个1e3的大T,emmm理论上会TLE的,但结果看网上题解,都是跟自己思路差不多,所以也是很迷. 嗯,转移过程其实很简单,dp[i][j]就是第i次抛了之后

概率DP 2017 ICPC 乌鲁木齐 A Coins

题目链接:https://nanti.jisuanke.com/t/40512 题意:n个硬币,初始全是反面朝上,抛m次,每次抛k个,求最好情况硬币向上个数的期望 一个比较好的概率DP的总结:https://blog.csdn.net/myjs999/article/details/81022546 分析:很明显当硬币反面朝上次数大于k,直接抛这些,小于k时,这些反面朝上全部取的,不够的加正面朝上的,dp[i][j]表示抛i次后正面朝上有j个的概率,枚举每次抛的硬币里面正面朝上有t个,状态转移方

大组合数取模之lucas定理模板,1&lt;=n&lt;=m&lt;=1e9,1&lt;p&lt;=1e6,p必须为素数

typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数 输入:C(n,m)%p 调用lucas(n,m,p) 复杂度:min(m,p)*log(m) ***********************************/ //ax + by = gcd(a,b) //传入固定值a,b.放回 d=gcd(a,b), x , y

Lucas 大组合数

题目:HDU 3037 题意:有n个树,m个坚果,放到n个树里,可以不放完,有多少种方法. 分析: 得到组合数了. 大组合数什么费马小定理,Lucas定理都来了: 总的说,不能用二维地推了,用的却是组合数的定义. 一般来说大组合通常要取模. 那么不能边乘边模,边除边模,等式不会成立. 根据逆元,除以一个数取模 = 乘以这个数对mod的逆元. 那么式子就可以写成: 这里,我们可以预处理所有 i 对 mod 的逆元后,累乘,这样得到的就是阶乘的逆元. 然后就是求 i 对 mod 的逆元了,什么扩展欧

多校杭电5794 大组合数(lucas)+dp

Problem Description There is a n×m board, a chess want to go to the position (n,m) from the position (1,1).The chess is able to go to position (x2,y2) from the position (x1,y1), only and if only x1,y1,x2,y2 is satisfied that (x2−x1)2+(y2−y1)2=5, x2>x

FZU 2020-组合(Lucas定理+逆元解决大组合数求模)

题目地址:FZU 2020 题意:求C(n,m)%p的值(1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数). 思路: 对于和并且p是素数,我们一般采用Lucas定理来解. 1).Lucas定理是用来求 C(n,m) mod p的值,p是素数.其描述为: 如果 那么得到 即 Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p) Lucas(n,0,p)=1; 2).对于大组合数求模C(N,

Lucas定理--大组合数取模 学习笔记

维基百科:https://en.wikipedia.org/wiki/Lucas%27_theorem?setlang=zh 参考:http://blog.csdn.net/pi9nc/article/details/9615359 http://hi.baidu.com/lq731371663/item/d7261b0b26e974faa010340f http://hi.baidu.com/j_mat/item/8e3a891c258c4fe9dceecaba 综合以上参考,我做的一下总结:

我不 大冰2017新书pdf免费下载

善意能消戾,善意能得缘,善意能带业往生,善意能回头是岸.善意能够帮人捕捉并建立起独特的幸福感. "我不"是一种善意坦然,也是一种善意的随缘,更是一句善意的自省. <我不>--百万级畅销书作家大冰2017年新书.书中的每一个故事都可以叫<我不>:十年如一日坚守藏地.为藏民基础教育尽一己之力的书店老板:亦正亦邪浪荡洒脱,散尽家财救助灾区.带重病母亲游历世界的东北浪子:木讷寡言对绝症女友不离不弃的流浪歌手:心系31年前阵亡战友.不愿偷生于世.为古城安危置生死于度外的不

壮美大山包-2017中国大山包国际超百公里ITRA积分赛赛记

2017年4月份用时28个多小时跑完江南100,付出的代价是双脚多达8个以上的水泡.所以接下来的4月29日的环汶川越野赛果断的从60公里换到了30公里组,慢悠悠的完成了. 虽然在赛道上一度想再也不参加超长距离越野赛了,但是赛后没几天就好了伤疤忘了痛.看到跑友发的大山包越野赛的报名帖子后,心里又蠢蠢欲动.大山包离成都只有500多公里,可以坐火车过去,而且看了大山包景区的照片,是那么的漂亮,晚上还可以看到每天的星空,运气好还有流星雨.而且大山包还有一个翼装飞行基地,简直不能再酷.所以就报了名,并拉上