题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2204
解题报告:输入一个n让你求出[1,n]范围内有多少个数可以表示成形如m^k的样子。
不详细说了,自己一开始也忽略了三个素数的乘积的乘方的情况。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long INT;
INT prim[]; int dabiao()
{
int f = ;
for(int i = ;i < ;++i)
{
int flag = ; for(int j = ;j < i;++j)
if(i % j == )
{
flag = ;
break;
}
if(flag) prim[f++] = i;
}
return f;
} int calc(INT a,INT b,INT n)
{
INT s = ;
while(b--)
{
if((INT)(n / a) <= s) return ;
s *= a;
}
return ;
}
int main()
{
INT n;
int num = dabiao();
while(scanf("%I64d",&n)!=EOF)
{
INT tot = ;
for(int i = ;i < num;++i)
{
INT temp = (INT)pow((double)n,1.0 / prim[i]);
if(temp == ) break; //开方之后不足1的话,则退出
tot += temp - ; //减1是因为每次都会统计到1
}
for(int i = ;i < num;++i)
for(int j = i+;j < num;++j)
{
INT temp = pow((double)n,1.0/(prim[i] * prim[j]));
if(temp == ) break;
tot -= temp - ;
}
for(int i = ;i < num;++i)
for(int j = i + ;j < num;++j)
for(int k = j + ;k < num;++k)
{
INT temp = pow((double)n,1.0/(prim[i] * prim[j] * prim[k]));
if(temp == ) break;
tot += temp - ;
}
printf("%I64d\n",tot);
}
return ;
}