HDU
来源:互联网 发布:网络交换机类型的杂志 编辑:程序博客网 时间:2024/06/18 16:58
题目要求:
点击打开链接
题意,求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;}