XTU-OJ 1339-Interprime

题目描述

n是两个连续的奇素数的平均值,且n不是素数,那么我们称这样的数是"内部素数"。求区间a,b内"内部素数"的个数。比如,前5个"内部素数"是4,6,9,12,15。

输入

第一行是样例数T(1≤T≤1000)。 每个样例一行,为三个整数a,b(1≤a≤b≤106)。

输出

每行输出一个样例的结果。

样例输入

复制代码
5
1 10
1 100
1 1000 
1 10000
1 100000

样例输出

复制代码
3
24
166
1228
9591

**解题思路:**本题最大的毒点就是,你如果就把最大数定为1e6,那么你将永远找不到错在哪,因为忘记考虑 一个小于1e6的数 + 一个大于1e6的数 除以 2,还是可能 小于 1e6 的。

AC代码:

cpp 复制代码
#include <stdio.h>

const int MAXN = 1e6+500;
bool vis[MAXN];               // 筛选MAXN个素数
int prime[80000];             // 把素数依次存放在该数组中
int abQuJian[MAXN];

void isPrime()
{
    for (int i = 2; i < MAXN; i ++)
    {
        if ( !vis[i])
            prime[++prime[0]] = i;      // prime[0] --> 筛选出的素数个数
        for (int j = 1; j <= prime[0] && i <= MAXN/prime[j]; j ++)
        {
            vis[i*prime[j]] = 1;
            if (i % prime[j] == 0)
                break;
        }
    }
}

void solve()
{
    for (int i = 2; i < prime[0]; i ++)
    {
        int n = (prime[i]+prime[i+1])/2;
        abQuJian[n] = 1;
    }
    for (int i = 2; i <= MAXN; i ++)
        abQuJian[i] += abQuJian[i-1];
}

int main()
{
    isPrime();          // 欧拉筛
    solve();            // 前缀和
    int T,a,b;
    scanf("%d",&T);
    while ( T --)
    {
        scanf("%d %d",&a,&b);
        printf("%d\n",abQuJian[b]-abQuJian[a-1]);
    }
}
相关推荐
Code_Solitude2 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司2 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP4 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀5 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落6 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Pniubi7 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
꧁细听勿语情꧂7 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
俊俊几年的8 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
小雉系统17 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构