题意:输出组合数C(n,m)的质因数
思路:将分母,分子分别质因数分解(短除法),记录每个质因数个数,用分母各个质因数的个数-分子的质因数的个数,即可;
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#define loop(a,b,c) for(int a=b;a<=c;a++)
#define nloop(a,b,c) for(int a=b;a>=c;a--)
#define clr(a,b) memset(a,b,sizeof a)
#define x first
#define y second
#define LL long long
// #define debug
using namespace std;
const int maxn=1000005;
int prime[maxn+1],notprime[maxn+1],num1[maxn];
void getprime()
{
clr(prime,0);
for(int i=2;i<=maxn;i++)
{
if(!prime[i]) prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
void init()
{
clr(notprime,false);
notprime[0]=notprime[1]=true;
for(int i=2;i<maxn;i++)
{
if(!notprime[i])
{
if(i>maxn/i) continue;
for(int j=i*i;j<maxn;j+=i)
notprime[j]=true;
}
}
}
void primedivide_x(int x)
{
for(int i=1;;)
{
if(!notprime[x])
{
num1[x]++;
break;
}
if(x%prime[i]==0)
{
num1[prime[i]]++;
x/=prime[i];
}
else i++;
}
}
void primedivide_y(int y)
{
for(int i=1;;)
{
if(!notprime[y])
{
num1[y]--;
break;
}
if(y%prime[i]==0)
{
num1[prime[i]]--;
y/=prime[i];
}
else i++;
}
}
int main()
{
#ifdef debug
freopen("data.txt","r",stdin);
#endif
int m,n;
init();
getprime();
while(scanf("%d %d",&n,&m))
{
if(!n&&!m) break;
int ans=0;
for(int i=m+1;i<=n;i++)
primedivide_x(i);
for(int j=2;j<=n-m;j++)
primedivide_y(j);
for(int i=1;i<=n;i++)
if(num1[i]>0){ans++;num1[i]=0;}
printf("%d\n",ans);
}
return 0;
}