N-47. 数筛

写在前面

原来就是数据错了,那没事了
话说你乐学非要出4e6的毒瘤数据干什么啊

题目

题目描述:

Jaanai最近知道了质数的定义是指有且只有两个因数的自然数。而Jaanai在写数学题的时候,她突然发现有很多自然数刚好拥有3个因数,她感到非常神奇,于是便把这种数命名为“Jaanai数”。但是现在她碰到一个难题,想让你帮她判断一个数是否为“Jaanai数”。

(提示:建议使用并修改质数筛函数)

输入格式:

一行输入n个正整数且不为1。

输出格式:

n行,第i行代表第i个数是否为“Jaanai数”。如果是,输出“TQL!”;如果不是,输出“TCL!”。

三个因数挺简单的,只需要是寻找平方数,使其平方根是质数,那么就有1,它自己,它的平方根三个因数了,开始我看成了四个/五个因数,这样其实更有意思,可以考虑一下怎么做~
所以我们只用判断一下平方数的平方根是否为质数就行了,这样本来是4e8的数就可以只用一个2e4的质数筛就行了,时间复杂度上还是没有什么压力的。
这里我直接用埃氏筛了,因为代码比线性筛好写,
埃氏筛的基本思路就是在一个区间内,如果找到一个质数,那它的在这个区间之内的倍数都是合数,都直接筛掉即可。

#include <stdio.h>     
#include <string.h>     
#include <math.h>     
#define ll long long    
int v[200100] = {0}, a[200100] = {0};    
void primes () {     
    memset(v, 0, sizeof v);    
    for (int i = 2; i <= 200000; i++) {     
       if (v[i]) continue;    
       a[i] = 1;    
      for (int j = 1; j <= 200000 / i; j++) v[i * j] = 1;    
    }     
      
}     
int main () {     
    primes();    
    int m;     
    while (scanf("%d", &m) != EOF) {     
    int ok = 0;    
    if ((int)sqrt(m) * (int)sqrt(m) == m && a[(int)sqrt(m)] == 1) ok = 1;    
        if (!ok) printf("TCL!\n");     
        else printf("TQL!\n");     
    }     
    return 0;     
}  

彩蛋(昨天写的东西)

鎩箅乐学

posted @ 2022-05-13 19:13  misasteria  阅读(164)  评论(0编辑  收藏  举报