Divisors
Time Limit:
1000MS
Memory Limit: 65536K
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
直接套质因数计数公式。
完整代码:
/*313ms,896KB*/
#include <cstdio>
using namespace std;
const int maxn = 432;
bool vis[maxn];
int num[maxn][maxn];
inline void check_prime()
{
for (int i = 2; i < 22; ++i)
if (!vis[i])
for (int j = i * i; j < maxn; j += i)
vis[j] = true;
}
int main()
{
check_prime();
int n, k;
int i, j, t;
for (i = 2; i < maxn; ++i)
{
for (j = 0; j <= i; ++j)
num[i][j] = num[i - 1][j];
t = i;
for (j = 2; j < maxn && t > 1; ++j)
if (!vis[j])
while (t % j == 0)
{
++num[i][j];
t /= j;
}
}
while (~scanf("%d%d", &n, &k))
{
__int64 ans = 1;
if (k && n - k)
for (i = 2; i <= n; ++i)
if (!vis[i])
ans *= num[n][i] - num[k][i] - num[n - k][i] + 1;
printf("%I64d\n", ans);
}
return 0;
}