Divisors
Description
Your task in this problem is to determine the number of divisors of
Cnk. Just for fun -- or do you need any special reason for such a useful computation?
Input
The input consists of several instances. Each instance consists of a single line containing two integers n and k (0 ≤ k ≤ n ≤ 431), separated by a single space.
Output
For each instance, output a line containing exactly one integer -- the number of distinct divisors of
Cnk. For the input instances, this number does not exceed 2
63 - 1.
Sample Input 5 1 6 3 10 4 Sample Output 2 6 16 Source |
解题报告:将素数打表,统计区间内的素因子数量,加1乘起来就是最终结果了。代码如下:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 431+1;
bool h[maxn];
int prime[maxn];
int primeNum;
void calPrime()
{
for(int i=2;i<maxn;i++) if(!h[i])
{
prime[primeNum++]=i;
for(int j=i+i;j<maxn;j+=i) h[j]=true;
}
}
int calN(int n, int t)
{
int res=0;
while(n>=t)
{
n/=t;
res+=n;
}
return res;
}
LL ans[maxn][maxn];
void work(int n, int k)
{
if(ans[n][k])
{
printf("%lld\n", ans[n][k]);
return;
}
LL res=1;
for(int i=0;i<primeNum && n>=prime[i];i++)
{
int t=calN(n, prime[i])-calN(k, prime[i])-calN(n-k, prime[i]);
res = res*(t+1);
}
ans[n][k]=ans[n][n-k]=res;
printf("%lld\n", res);
}
int main()
{
calPrime();
int n, k;
while(~scanf("%d%d", &n, &k))
work(n, k);
}