码迷,mamicode.com
首页 > 其他好文 > 详细

一些数论知识点

时间:2017-10-25 01:04:49      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:class   预处理   main   span   pre   style   bsp   scanf   知识   

Lucas定理:

$C_{b}^{a}\pmod p= C_{b/p}^{a/p}*C_{b \pmod p}^{a \pmod p}\pmod p$

通常在p较小时用。

对于$C_{b/p}^{a/p}$,递归计算,

对于$C_{b \pmod p}^{a \pmod p}$,通过预处理阶乘和阶乘的逆元求。

至于证明。。我也不会。

模板:洛谷3807

#include<cstdio>
const int maxn=100000;
typedef long long ll;
ll fac[maxn+10],invfac[maxn+10];
ll fpow(ll a,ll b,ll p){
    ll ans=1;
    for(;b;b>>=1,a=a*a%p) if(b&1) ans=ans*a%p;
    return ans;
}
ll prework(ll p){
    fac[0]=invfac[0]=1;
    for(int i=1;i<=maxn;++i){
        fac[i]=fac[i-1]*i%p;
        invfac[i]=fpow(fac[i],p-2,p);
    }
}
ll c(ll a,ll b,ll p){
    if(a>b) return 0;
    return fac[b]*invfac[a]%p*invfac[b-a]%p;
}
ll lucas(ll a,ll b,ll p){
    if(!a) return 1;
    return lucas(a/p,b/p,p)*c(a%p,b%p,p)%p;
}
ll t,a,b,p;
int main(){
    scanf("%lld",&t);
    for(;t--;){
        scanf("%lld%lld%lld",&a,&b,&p); prework(p);
        printf("%lld\n",lucas(b,a+b,p));
    }
    return 0;
}

 中国剩余定理:

技术分享

 

一些数论知识点

标签:class   预处理   main   span   pre   style   bsp   scanf   知识   

原文地址:http://www.cnblogs.com/jxcakak/p/7726159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!