HDU - 2204 Eddy's爱好 (容斥定理)

HDU - 2204 Eddy’s爱好 (容斥定理)

Ignatius 喜欢收集蝴蝶标本和邮票,但是Eddy的爱好很特别,他对数字比较感兴趣,他曾经一度沉迷于素数,而现在他对于一些新的特殊数比较有兴趣。
这些特殊数是这样的:这些数都能表示成M^K,M和K是正整数且K>1。
正当他再度沉迷的时候,他发现不知道什么时候才能知道这样的数字的数量,因此他又求助于你这位聪明的程序员,请你帮他用程序解决这个问题。
为了简化,问题是这样的:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K(K>1)的数。
Input
本题有多组测试数据,每组包含一个整数N,1<=N<=1000000000000000000(10^18).
Output
对于每组输入,请输出在在1到N之间形式如M^K的数的总数。
每组输出占一行。
Sample Input
10
36
1000000000000000000
Sample Output
4
9
1001003332

解题思路:

问的是1-n之间满足x^k次方的有多少个(k>=2)

首先我们得知道一个东西:
1-n之间是2的次方的数有多少个? n^(1/2) 向下取整
1-n之间是3的次方的数有多少个? n^(1/3)
……
1-n之间是k的次方的数有多少个? n^(1/k)
比如1-10之间 2的次方数有多少个 10^(1/2) 也就是根号10 = 3个。 验证一下 1²=1 2²=4 3²=9 确实是3个。

然后我们再来看我们这个问题
如果一个数是4次方 那么他一定是2次方。所以4次方的就不用管了。我们只用管素数次方的就行。
那到多少呢???64以下的素数足以。为什么呢? 因为最小的数就是2吧 2^64 = 1e18了所以我们只要求64以内的素数次方的数有多少个即可。
那么 有没有重复呢?肯定是有的 一个数是6次方的 那么一定是2次方和3次方的。所以这时候就用到了容斥定理了只要最多容斥三次就可,因为最小的三个素数 乘起来 235 = 30 2^30已经接近1e18了。

AC代码:


#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int prime[100];
int cnt = 0;
void init(){
   
    prime[cnt++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值