33,311
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#define NMAX 32768
#define PIMAX 3512
#define NPRI 4096
int primes[NPRI];
int init(void)
{
int bits[NMAX / 8 / sizeof(int) + 1], k, p;
memset(bits, 0xFF, sizeof(bits));
bits[0] &= ~3;
for (p = 3; p < NMAX; p += 2)
{
if (bits[p / 8 / sizeof(int)] & (1 << (p % (8 * sizeof(int)))))
{
for (k = p * p; k < NMAX; k += p)
bits[k / 8 / sizeof(int)] &= ~(1 << (k % (8 * sizeof(int))));
}
}
k = 1;
primes[0] = 2;
for (p = 3; p < NMAX; p += 2)
{
if (bits[p / 8 / sizeof(int)] & (1 << (p % (8 * sizeof(int)))))
primes[k++] = p;
}
return k;
}
int solve(int N)
{
int r = 1, X[12], n = 0, i = 0, t, sqN = sqrt(N);
for (;;)
{
t = primes[i++];
if (t > N || t > sqN)
break;
if (0 == N % t)
{
X[n] = 0;
do {
++X[n];
N /= t;
} while (0 == N % t);
++n;
}
}
if (1 != N)
X[n++] = 1;
for (i = 0; i < n; ++i)
r *= 2 * X[i] + 1;
return r;
}
int main()
{
int N;
N = init();
printf("PI(%d) == %d\n", NMAX, N);
assert(N == PIMAX);
while (1 == scanf("%d", &N) && N >= 1 && N <= 1000000000)
printf("%d\n", solve(N));
}