首页 > 其他 > 详细

卢卡斯定理

时间:2018-11-30 10:55:35      阅读:166      评论:0      收藏:0      [点我收藏+]

(说实话推断过程不是我这种弱鸡能看懂的,直接上结论。。。)

卢卡斯定理:

C(n, m) % p = (C(n/p, m/p) % p) * (C(n%p, m%p) % p) % p

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long u64;

const int maxn = 100000 + 10;
u64 n, m, p, fac[maxn];

inline u64 Fast_Pow(u64 x, u64 k) {
    u64 ans = 1;
    while(k) {
        if( k&1 ) ans = ans * x % p;
        k >>= 1, x = x * x % p;
    }
    return ans;
}

u64 C(u64 k, u64 b) {
    if( k<b )  return 0;
    return fac[k] * Fast_Pow(fac[b] % p, p-2) % p * Fast_Pow(fac[k-b] % p, p-2) % p;
}

u64 Lucas(u64 k, u64 b) {
    if( !b )  return 1;
    return C(k%p, b%p) * Lucas(k/p, b/p) % p;
}

int main(int argc, char const *argv[])
{
    int t;  scanf("%d", &t);
    while( t-- ) {
        fac[0] = 1;
        scanf("%lld%lld%lld", &n, &m, &p);
        for(int i=1; i<=p; ++i)
            fac[i] = fac[i-1] * i % p;
        printf("%lld\n", Lucas(n+m, m));
    }
    return 0;
}

 

卢卡斯定理

原文:https://www.cnblogs.com/KasenBob/p/10042211.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!