/*
将C(n,k)质因数分解,然后约束个数按公式计算
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
int v[
1000],prime[
1000],m,c[
200],p[
200];
void init(
int n){
memset(prime,0,
sizeof prime);
memset(v,0,
sizeof v);
m=
0;
for(
int i=
2;i<=n;i++
){
if(v[i]==
0){
v[i]=
i;
prime[++m]=
i;
}
for(
int j=
1;j<=m;j++
){
if(prime[j]>v[i] || prime[j]*i>n)
break;
v[i*prime[j]]=
prime[j];
}
}
}
int cal(
int p,
int n){
int ret=
0,tmp=
p;
while(tmp<=
n){
ret+=n/
tmp;
tmp*=
p;
}
return ret;
}
int main(){
int n,k;
init(500);
while(scanf(
"%d%d",&n,&k)==
2){
memset(c,0,
sizeof c);
memset(p,0,
sizeof p);
ll ans=
1;
for(
int i=
1;i<=m;i++
){
if(prime[i]>n)
break;
c[i]+=
cal(prime[i],n);
}
for(
int i=
1;i<=m;i++
){
if(prime[i]>n-k)
break;
c[i]-=cal(prime[i],n-
k);
}
for(
int i=
1;i<=m;i++
){
if(prime[i]>k)
break;
c[i]-=
cal(prime[i],k);
}
for(
int i=
1;i<=m;i++
)
if(c[i]) ans*=(c[i]+
1);
printf("%lld\n",ans);
}
}
转载于:https://www.cnblogs.com/zsben991126/p/10231764.html