【NOIP2015模拟11.2晚】Lala买面包

本文探讨了如何高效地确定给定范围内的数值中,有多少个数能够表示为某个大于等于2的整数的平方以上任意次幂。通过筛选质数,优化枚举过程,实现对大规模数据集的有效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值