<pre name="code" class="cpp">#include <iostream>
#include <algorithm>
#include "memory.h"
#include <cmath>
#include "stdio.h"
using namespace std;
#define N 435
//素数分解 s = p1^k1 * p2^k2 * …… 因子个数为 (1 + k1) * (1 + k2) * ……
bool used[N];
int p[N]; // p[0] 表示素数的个数
int fac[N][90]; //fac[i][j] 1 到 i 的 过程中因子 为j的个数
void Init()
{
memset(used,false,sizeof(used));
p[0] = 1;
for (int i = 2; i < N; i++)
{
if (!used[i])
{
p[p[0]] = i; p[0]++;
}
for (int j = 1; j < p[0] && i * p[j] < N; j++)
{
used[i * p[j]] = true;
if (i % p[j] == 0) break;
}
}
/*
for (int i = 1; i < p[0]; i++)
printf("%d ",p[i]);
printf("%d\n",p[0]);
*/
memset(fac,0,sizeof(fac));
for (int i = 2; i <= 431; i++)
{
int k = i;
for (int j = 1; j < p[0]; j++)
{
while (k > 1 && (k % p[j] ==0))
{
fac[i][j]++;
k = k / p[j];
}
}
}
for (int i = 2; i <= 431; i++)
{
for (int j = 1; j < p[0]; j++)
fac[i][j] += fac[i - 1][j];
}
}
int main()
{
Init();
int n,k;
while (scanf("%d%d",&n,&k) != EOF)
{
long long sum = 1;
for (int i = 1; i < p[0]; i++)
sum *= (1 + fac[n][i] - fac[k][i] - fac[n - k][i]);
printf("%lld\n",sum);
}
return 0;
}
poj 2992 Divisors
最新推荐文章于 2019-02-27 20:06:26 发布