#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
typedef long long ll;
using namespace std;
ll quick_mod(ll a,ll b,ll m){
ll ans = 1;
a %= m;
while(b){
if(b&1)
ans = ans * a % m;
b >>= 1;
a = a * a % m;
}
return ans;
}
ll getC(ll n, ll m,ll mod){
if(m > n)
return 0;
if(m > n-m)
m = n-m;
ll a = 1,b = 1;
while(m){
a = (a*n)%mod;
b = (b*m)%mod;
m--;
n--;
}
return a*quick_mod(b,mod-2,mod)%mod;
}
ll Lucas(ll n,ll k,ll mod){
if(k == 0)
return 1;
return getC(n%mod,k%mod,mod)*Lucas(n/mod,k/mod,mod)%mod;
}
int main() {
int n, m, p=1e9+7;
while(~scanf("%d%d", &n, &m)) {
printf("%lld\n", Lucas(n, m, p));
}
return 0;
}
卢卡斯定理模板(当n和m很大,p为素数时)
最新推荐文章于 2021-04-12 21:58:14 发布