【数论】洛谷P3807 卢卡斯定理

版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/89212508

D e s c r i p t i o n Description

C n + m n   m o d   p C_{n+m}^n\ mod\ p

数据范围 , m n p 1 0 5 ,m\leq n\leq p\leq 10^5


S o l u t i o n Solution

L u c a s Lucas 定理

p p 是质数,则对于任意整数 1 m n 1\leq m\leq n ,有:
C n m C n   m o d   p m   m o d   p × C n / p m / p C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ p}\times C_{n/p}^{m/p}


C o d e Code

#include<cstdio>
#include<cctype>
using namespace std;typedef long long LL;
const int N=100010;
LL fac[N]={1,1},inv[N]={1,1},n,m,p,t;
inline LL read()
{
    char c;int f=0,d=1;
    while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
    while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
    return d*f;
}
inline void write(LL x){if(x>9)write(x/10);putchar(x%10+48);return;}
inline LL ksm(LL x,LL y)
{
    LL ans;
    for(ans=1;y;(x*=x)%=p,y>>=1) if(y&1)(ans*=x)%=p;
    return ans;
}
inline LL C(LL n,LL m){if(n<m) return 0;return (fac[n]*inv[m]%p*inv[n-m]%p)%p;}
inline LL Lucas(LL n,LL m){if(!m)return 1;return C(n%p,m%p)*Lucas(n/p,m/p)%p;}
signed main()
{
    t=read();
    while(t--)
    {
        n=read();m=read();p=read();
        for(register int i=2;i<=p;i++) (fac[i]=fac[i-1]*i)%=p;inv[p-1]=ksm(fac[p-1],p-2);
        for(register int i=p-2;i>1;i--) inv[i]=(inv[i+1]*(i+1))%p;
        printf("%lld\n",Lucas(n+m,n));
    }
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/89212508