您的位置:首页 > 其它

卢卡斯定理模板(当n和m很大,p为素数时)

2018-03-01 14:56 316 查看
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;

LL exp_mod(LL a, LL b, LL p) {
LL res = 1;
while(b != 0) {
if(b&1) res = (res * a) % p;
a = (a*a) % p;
b >>= 1;
}
return res;
}

LL Comb(LL a, LL b, LL p) {
if(a < b)   return 0;
if(a == b)  return 1;
if(b > a - b)   b = a - b;

LL ans = 1, ca = 1, cb = 1;
for(LL i = 0; i < b; ++i) {
ca = (ca * (a - i))%p;
cb = (cb * (b - i))%p;
}
ans = (ca*exp_mod(cb, p - 2, p)) % p;
return ans;
}

LL Lucas(int n, int m, int p) {
LL ans = 1;

while(n&&m&&ans) {
ans = (ans*Comb(n%p, m%p, p)) % p;
n /= p;
m /= p;
}
return ans;
}

int main() {
int n, m, p=1e9+7;
while(~scanf("%d%d", &n, &m)) {
printf("%lld\n", Lucas(n, m, p));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: