题解 P1865 【A % B Problem】

· · 题解

首先,我认为我码风很丑。

好我们开始正经写题解。

【关键词】记忆化搜索,素数判断,AC

是的就是题目标签里的两个词,很水

【思路】

1,从1到m遍历,前缀和求出每个数及之前的质数个数。
2,1到n输入区间,直接查询:a[r]-a[l-1] ,输出。
(注意是L-1而不是L,因为包括L这里是故意用的大写L因为l和1太像不好区分
3,提交,AC~
4,自己不太会判断时间复杂度,但是自己感觉我这个代码过不了可能会T,,,交了居然一遍AC也是蛮神奇的了hhh,可能是数据水叭

惯例附【代码】:

(建议思路看会的就自己写叭毕竟码风丑而且自己写记得才牢哇)

/*(^-^)*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll n,m,l,r,t,a[1000005];

bool judge(ll x)
{
    if(x==1)return false;//来个特判
    for(ll i=2;i<=sqrt(x);i++)
        if(x%i==0)return false;
    return true;
}
//简单的判断素数

int main()
{
    scanf("%lld %lld",&n,&m);
    for(ll i=1;i<=m;i++)
    {
        if(judge(i))a[i]=a[i-1]+1;
        else a[i]=a[i-1];
    }
    //1~m的遍历

    for(ll i=1;i<=n;i++)
    {
        scanf("%lld %lld",&l,&r);
        if(l>m||r>m||l<1||r<1){printf("Crossing the line\n");}
        else printf("%lld\n",a[r]-a[l-1]);
    }//输入输出完事儿~
    return 0;
}