bzoj2982

求组合数的板子
lucas相关

#include<cstdio>
#include<cctype>
inline void read(int &x){
    char ch=getchar();x=0;
    for(;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
}
typedef long long ll;
const int mo=10007,N=1e5+9;
int T,fac[N],inv[N],n,m;
inline int ksm(int x,int k){
    int ans=1;
    for(;k;k>>=1,x=1ll*x*x%mo)if(k&1)ans=1ll*ans*x%mo;
    return ans;
}
inline int C(int x,int y){
    if(x<y)return 0;
    if(x<mo && y<mo)return 1ll*fac[x]*inv[y]%mo*inv[x-y]%mo;
    return 1ll*C(x%mo,y%mo)*C(x/mo,y/mo)%mo;
}
int main(){
    read(T);fac[0]=1;
    for(int i=1;i<mo;i++)fac[i]=1ll*fac[i-1]*i%mo;
    inv[mo-1]=ksm(fac[mo-1],mo-2);
    for(int i=mo-2;i>=0;i--)inv[i]=(inv[i+1]*(i+1))%mo;//a^(p-1)==1相当于消去了一个
    for(;T;T--){
        read(n),read(m),printf("%d\n",C(n,m));
    } 
    return 0;
}

转载于:https://www.cnblogs.com/MikuKnight/p/9874669.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值