圆内连弦 - 卡特兰数

http://www.nowcoder.com/questionTerminal/d35a6bd70db24796badf71366328412f

知识点
总方案数是其中表示每次选择2个,除以表示这n次选择没有先后

而可行数是圆内连弦的个数,是个卡特兰数,不会的可以去上面的博客学习一下卡特兰数以及在圆内连弦的解法

化简总方案数

卡特兰数为

那么答案就是,求(n + 1)! % mod在mod下的逆元乘以 % mod即可

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e7 + 5;
ll pow(ll a, ll b, ll p){
    ll ans = 1; a %= p;
    while(b){
        if(b & 1)ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans;
}
int n, fac, f[N];
int main(){
    scanf("%d", &n);
    fac = 1;
    for(int i = 1; i <= n + 1; i++)
        fac = 1ll * fac * i % mod;
    printf("%lld\n", pow(2, n, mod) * pow(fac, mod - 2, mod) % mod);
    return 0;
}
全部评论

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务