质数判断 + 前缀和 - Prime Time - UVA - 10200

质数判断 + 前缀和 - Prime Time - UVA - 10200

题意:

给 定 一 个 计 算 公 式 : 给定一个计算公式:

f ( n ) = n 2 + n + 41 f(n)=n^2+n+41 f(n)=n2+n+41

当 0 ≤ n < 40 时 , f ( n ) 恒 为 质 数 , 而 f ( 40 ) = 41 ∗ 41 为 合 数 。 当0\le n<40时,f(n)恒为质数,而f(40)=41*41为合数。 0n<40f(n)f(40)=4141

现 给 定 一 个 区 间 [ a , b ] , 计 算 区 间 中 , 满 足 f ( i ) 为 质 数 的 i 的 个 数 , 占 区 间 的 比 例 是 多 少 , i ∈ [ a , b ] 。 现给定一个区间[a,b],计算区间中,满足f(i)为质数的i的个数,占区间的比例是多少,i∈[a,b]。 [a,b]f(i)ii[a,b]

输入:

多 组 测 试 数 据 , 多组测试数据,

每 组 包 括 两 个 正 整 数 a , b , 0 ≤ a ≤ b ≤ 10000 每组包括两个正整数a,b,0 ≤ a ≤ b ≤ 10000 a,b0ab10000

输出:

百 分 比 , 小 数 点 后 保 留 两 位 数 字 。 百分比,小数点后保留两位数字。

Sample Input

0 39
0 40
39 40

Sample Output

100.00
97.56
50.00

分析:

抽 象 地 , 本 题 即 计 算 区 间 [ a , b ] 中 , 有 多 少 个 整 数 i , 满 足 f ( i ) 是 质 数 , 假 设 有 c n t 个 , 抽象地,本题即计算区间[a,b]中,有多少个整数i,满足f(i)是质数,假设有cnt个, [a,b]if(i)cnt

则 答 案 为 : c n t b − a + 1 × 100 % 则答案为:\frac{cnt}{b-a+1}×100\% ba+1cnt×100%

若 对 于 每 一 组 a 和 b , 都 暴 力 枚 举 , 会 T L E 。 若对于每一组a和b,都暴力枚举,会TLE。 abTLE

要 求 区 间 中 满 足 某 种 条 件 的 数 的 个 数 , 可 以 采 用 前 缀 和 的 思 想 进 行 预 处 理 。 然 后 直 接 查 询 即 可 。 要求区间中满足某种条件的数的个数,可以采用前缀和的思想进行预处理。然后直接查询即可。

注意:

本 题 坑 点 在 于 精 度 的 误 差 , 最 后 输 出 要 加 上 e p s 。 本题坑点在于精度的误差,最后输出要加上eps。 eps

代码:

#include <sstream>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N=10010;
const double eps=1e-6;

int cnt[N], sum[N];

int f(int n)
{
    return n*n+n+41;
}

bool check(int x)
{
    if(x<2) return false;
    for(int i=2;i<=x/i;i++)
        if(x%i==0)
            return false;
    return true;
}

void pre()
{
    for(int i=0;i<=10000;i++)
        if(check(f(i)))
            cnt[i]=1;
    sum[0]=1;
    for(int i=1;i<=10000;i++) sum[i]=sum[i-1]+cnt[i];
}

int main()
{
    pre();

    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        int t;
        if(a==0) t=sum[b];
        else t=sum[b]-sum[a-1];
        double ans=(double)t/(b-a+1);
        printf("%.2lf\n",ans*100+eps);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值