【NOIP2015模拟11.2晚】Lala买面包

Description

给出n个数,求这n个数中有多少个数可以写成x^p(x>=2,p>=2)的形式。
n<=10^6
每个数<=10^14

Solution

很容易想到枚举指数。
一个明显的性质,指数只可能是质数,且最大为50.
那么我们可以直接求出1~50之间的质数,然后枚举判断。
可以用c++黑科技pow作弊。
注意精度。(我恨实数运算!)

Code

#include<cstdio>
#include<cmath>
#define fo(i,a,b) for(ll i=a;i<=b;i++)
#define ll long long
#define db long double
#define N 50
using namespace std;
int n,ans,f[N+5],p[N+5];
ll x;
int main() {
    freopen("bread.in","r",stdin);
    freopen("bread.out","w",stdout);
    fo(i,2,N)
        if (!f[i]) {
            p[++p[0]]=i;fo(j,2,N/i) f[i*j]=1;
        }
    scanf("%d",&n);
    fo(i,1,n) {
        scanf("%lld",&x);
        if (x<2) continue;
        fo(j,1,p[0]) {
            db z=round(pow(x,1.0/p[j]));
            if (pow(z,p[j])==x) {ans++;break;}
        }
    }
    printf("%d",ans);
}

你可能感兴趣的:(数论,暴力,黑科技)