以下为参考大牛http://blog.csdn.net/acm_cxlove/article/details/7873776
题目:求出1-N里面能表示 成M^K的数有多少个
求A^B在<=n的最大的A,所以1~A也都满足
//如果A^B在<=n,那么i^B<=n (A>i>=1)
//因为2^60>1e18所以 B不超过60
另外B考虑质因子,如果A^4在范围内的话,肯定(2*A)^2也在范围内,没有必要重复考虑
指数虽然考虑了质因子,但是我们发现还是有重复,如果说4^3与8^2还是重复了,这是因为他们同为2^6。
我们用Ai表示指数为质因子Pi的数目,那么A1+A2……Ak-(A1交A2)-(A1交A3)……+(A1交A2交A3)……
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e6+20;
const ll inf=1e12;
vector <int> p;
ll n,ans;
bool check(int x)
{
for(int i=2;i*i<=x;i++)
if(x%i==0)
return false;
return true;
}
void dfs(int id,int num,int t,int tot)//num当前指数 ,t当前因子数,tot最多因子数
{
if(t==tot)
{
ll tmp=ll(pow(n,1.0/num));//求A^B在<=n,最大的A所以1~A也都满足
//如果A^B在<=n,那么i^B<=n (A>i>=1)
tmp--;// 1^num
if(tot&1)
ans+=tmp;
else
ans-=tmp;
return;
}
if(id>=17) return;
if(num*p[id]<60)
dfs(id+1,num*p[id],t+1,tot);
dfs(id+1,num,t,tot);//
}
int main()
{
for(int i=2;i<=60;i++)//2^60>1e18 幂在60内
{
if(check(i))
p.push_back(i);
}
while(cin>>n)
{
ans=0;
for(int i=1;i<=3;i++)//最多因子数为3 2*3*5*7>60
dfs(0,1,0,i);
cout<<ans+1<<endl;
}
return 0;
}