SP19148Kill them All,组合+阶乘逆元

a,b杀n个人,每时每刻都必须是b>a
第一个人必定是b杀,所以问题就转化为图像从(1,0) 到(b杀,a杀)不碰y=x的方法数
满足方法数=所有方法数-不满足方法数
不满足方法数计算:从(0,1) 到(b杀,a杀)的方法数(如图只要把每次的路线按y=x对称就是一条(1,0)出发过线的方法)


不满足:
所有
所有-不满足=C(n-1,n/2)

求C(n-1,n/2)= (n-1)!/(n/2)!/(n-1-n/2)!
求阶乘先用线性筛 求出每一个数的逆
在通过逆元的积性
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10, mod=1e9+7;
typedef long long ll;

ll fact[N],invfact[N];
int t,n;

ll C(int n,int m){
//cout<<fact[n]<<" "<<invfact[m]<<" "<<invfact[n-m]<<endl;
	return fact[n]*invfact[m]%mod*invfact[n-m]%mod;
}
void init(){
    fact[0]=1;
    
    for(int i=1;i<=N-5;i++) fact[i]=fact[i-1]*i%mod;
    invfact[0]=invfact[1]=1;
    for(int i=2;i<=N-5;i++) invfact[i]=(mod-(mod/i))*invfact[mod%i]%mod;//每个数的逆
    for(int i=2;i<=N-5;i++) invfact[i]=invfact[i]*invfact[i-1]%mod;//阶乘的逆
}
int main(){
    scanf("%d",&t);
    init();

    for(int i=0;i<t;i++){
        scanf("%d",&n);
        printf("%lld\n",C(n-1,n/2));
    }
    return 0;
}



全部评论

相关推荐

06-11 15:52
东南大学 C++
问了一下hr,这个回答是G了吗
椛鸣:我遇到过 我给你翻一下 对不起 我之前把你当备胎了 现在我人已经招满了 ***吧
点赞 评论 收藏
分享
04-27 08:59
常州大学 Java
牛客139242382号:《两门以上汇编语言》
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务