hdu 2204

来源:互联网 发布:淘宝 排名 编辑:程序博客网 时间:2024/06/10 07:20

枚举一下再容斥。

贴代码。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int N=65;#define eps 1e-8int prime[N],isprime[N];void getPrime(){    int i,j;    prime[0]=0;    for(i=0;i<N;i++)        isprime[i]=1;    for(i=2;i<N;i++)        if(isprime[i]){            prime[++prime[0]]=i;            for(j=2;i*j<N;j++)                isprime[i*j]=0;        }}int main(){    //freopen("input.txt","r",stdin);    long long n,tmp;    getPrime();    while(cin>>n){        int ans=1;        for(int i=1;i<=prime[0];i++){            tmp=(long long)(pow((double)n,1.0/prime[i])+eps);   //不加eps则WA            if(tmp==1)      //减枝,下同                break;            ans+=tmp-1;        }        for(int i=1;i<=prime[0];i++)            for(int j=i+1;j<=prime[0];j++){                tmp=(long long)(pow((double)n,1.0/(prime[i]*prime[j]))+eps);                if(tmp==1)                    break;                ans-=(tmp-1);            }        for(int i=1;i<=prime[0];i++)            for(int j=i+1;j<=prime[0];j++)                for(int k=j+1;k<=prime[0];k++){                    tmp=(long long)(pow((double)n,1.0/(prime[i]*prime[j]*prime[k]))+eps);                    if(tmp==1)                        break;                    ans+=(tmp-1);                }        printf("%d\n",ans);    }    return 0;}


0 0