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;}




原创粉丝点击