题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=509
解题思路:
对2-n素分解,然后记录最大的素因子即可。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 10010;
int prim[N], res[N], temp; //temp记录最大素因子
void fun()
{
memset(prim, 0, sizeof(prim));
int limit = sqrt(N * 1.0);
for(int i = 2; i <= limit; ++i)
if(!prim[i])
for(int j = i * i; j < N; j += i)
prim[j] = 1;
int top = 0;
for(int i = 2; i < N; ++i)
if(!prim[i])
prim[top++] = i;
}
void prim_induce(int n)
{
for(int i = 0; ; ++i)
{
while(n % prim[i] == 0)
{
n /= prim[i];
res[prim[i]]++;
}
if(n == 1)
{
temp = max(temp, prim[i]);
break;
}
}
if(n != 1)
{
res[n] += 1;
temp = max(temp, n);
}
}
int main()
{
fun();
int ncase, n;
scanf("%d", &ncase);
while(ncase--)
{
temp = 0;
memset(res, 0, sizeof(res));
scanf("%d", &n);
for(int i = 2; i <= n; ++i)
prim_induce(i);
for(int i = 2; i <= temp; ++i)
if(res[i])
printf("%d ", res[i]);
printf("\n");
}
return 0;
}