题目要求:
题意,求N以内有多少数可以表示成m^k,很明显的容斥,只需要枚举指数k就好,但是神奇的是我这题居然状压怎么都写不对,于是换成了不太熟练的dfs的写法,原理上是一样的。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<stack>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
long long rec[30];
bool prime[70];
int cnt;
void init()
{
cnt=0;
for (int i=0;i<30;i++)
rec[i]=0;
for (int i=2;i<=60;i++)
prime[i]=true;
for (int i=2;i<=60;i++)
{
if (prime[i])
{
rec[cnt]=i;
cnt++;
for (int j=i+i;j<=60;j=j+i)
prime[j]=false;
}
}
}
long long ans;
long long n;
void dfs(long long index,long long exp,long long coe)
{
long long k=0;
for (long long i=index;i<cnt;i++)
{
k=(long long)pow(n,1.0/(exp*rec[i]));
if (coe&1) ans=ans+k;
else ans=ans-k;
if (k<=1) break;
dfs(i+1,exp*rec[i],coe+1);
}
}
int main()
{
init();
while(cin>>n)
{
ans=0;
dfs(0,1,1);
cout<<ans<<endl;
}
return 0;
}