原文链接:http://www.cnblogs.com/DrunBee/archive/2012/09/05/2672546.html

题意:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K(K>1)的数。

我们可以由n^(1/p),知道指数为p的有多少个数。

通过观察,可以发现若一个数可以表示成x^(k*t),则可以表示成(x^k)^t。因此指数必然为素数。

枚举素数便可以得到指数为p的个数,但是可能出现重复,例如:x^3=y^5,其中x=t^5,y=t^3。

运用容斥原理,设a[i]表示指数为第i个素数的个数,那么答案等于满足一个的,减去两个的,加上三个的……

由于2^60>10^18,2*3*5*7>60,所以只要枚举到三即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#define EPS 1e-8
#define MAXN 65
typedef long long LL;
using namespace std;
bool p[MAXN];
vector<int> prime;
void Init()
{
int i, j;
memset(p, true, sizeof(p));
for (i = ; i < ; i++)
{
if (p[i])
{
for (j = i * i; j < MAXN; j += i)
p[j] = false;
}
}
prime.clear();
for (i = ; i < MAXN; i++)
{
if (p[i])
prime.push_back(i);
}
}
int main()
{
LL n, tmp;
int i, j, k, ans;
Init();
while (~scanf("%I64d", &n))
{
ans = ;
for (i = ; i < (int) prime.size(); i++)
{
tmp = (LL) (pow((double) n, 1.0 / prime[i]) + EPS);
if (tmp == )
break;
ans += tmp - ;
}
for (i = ; i < (int) prime.size(); i++)
{
for (j = i + ; j < (int) prime.size(); j++)
{
tmp = (LL) (pow((double) n, 1.0 / (prime[i] * prime[j])) + EPS);
if (tmp == )
break;
ans -= tmp - ;
}
}
for (i = ; i < (int) prime.size(); i++)
{
for (j = i + ; j < (int) prime.size(); j++)
{
for (k = j + ; k < (int) prime.size(); k++)
{
tmp = (LL) (pow((double) n,
1.0 / (prime[i] * prime[j] * prime[k])) + EPS);
if (tmp == )
break;
ans += tmp - ;
}
}
}
printf("%d\n", ans);
}
return ;
}

最新文章

  1. 应用程序无法正常启动0xc0150002(windows server 2003)
  2. vector、list、deque三者比较
  3. Spring(一)
  4. 切换npm源
  5. Java学习笔记(十六)——Java RMI
  6. Repeater控件的分页效果
  7. &quot;undefined reference to&quot; 问题解决方法 -链接问题
  8. Oracle数据库之FORALL与BULK COLLECT语句
  9. Request url 各种属性值
  10. 基于Excel参数化你的Selenium2测试代码
  11. postgis几何操作函数集
  12. idea中使用svn,忽略本地修改的指定的文件
  13. C++笔记--thread pool【转】
  14. 第二章 基础查询 2-1 SQL语句基础
  15. L1-049. 天梯赛座位分配
  16. java项目使用mvn打包时,出现数据库连接错误
  17. XML解析(DOM、ElementTree)及转换为JSON
  18. SSD win7优化步骤
  19. Xshell连接不上Ubuntu的解决方法
  20. 4.Servlet过滤器

热门文章

  1. 《JavaScript高级程序设计》心得笔记-----第二篇章
  2. Geodatabase介绍
  3. Codevs
  4. 向CodeBlocks的Project中添加calss文件时,出现No such file or directory错误的解决方案
  5. 第四届蓝桥杯C/C++A组题目:振兴中华
  6. jquery 处理字符串 【转】
  7. 利用PowerDesigner绘制PDM生成SQL Server数据库
  8. System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本
  9. 使用socket.io搭建聊天室
  10. Delphi XE5教程1:语言概述