一开始以为询问是在线的,然后各种GG。。。
按照题意,询问是预先确定好的,所以直接询问 是素数的多少次方就行了 。
例如,n=10时,询问 2 2^2 2^3 3 3^3 5 7。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1010;
int npri[MAXN],pri[MAXN];
int main()
{
int i,j,ans,n,prisum,tmp;
memset(npri,0,sizeof(npri));
prisum=0;
for(i=2;i<MAXN;i++)
{
if(!npri[i])
{
pri[prisum++]=i;
for(j=i+i;j<MAXN;j+=i)
npri[j]|=1;
}
}
while(~scanf("%d",&n))
{
ans=0;
for(i=0;i<prisum&&pri[i]<=n;i++)
{
tmp=pri[i];
while(tmp<=n)
{
tmp*=pri[i];
ans++;
}
}
printf("%d\n",ans);
}
}

本文介绍了一种计算特定范围内素数幂次总和的高效算法。通过预处理所有小于给定范围内的素数,并计算这些素数的幂次贡献,实现了快速响应大量预设查询的功能。
494

被折叠的 条评论
为什么被折叠?



