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;
}
彩蛋(昨天写的东西)
鎩箅乐学