/ SB域 / 题库 /

质数问题

质数问题

Background

公元前3世纪,古希腊数学家欧几里得已经证明素数的数目是无穷的;2004年,格林和陶哲轩证明存在任意长的素数等差数列,他们的发现揭示了素数中存在的某种规律。
在数学家的眼中,素数是美丽的。就像原子之于化学家、DNA之于遗传学家,素数是自然界中全部数的最基本的结构砖块。那么究竟什么是素数呢?也许任何一位小学三年级的学生都会清楚地回答这个问题:在自然数中,除了1以外,只能被自身和1整除的数就是素数,素数从2,3,5,7,11和17开始……
但是非常令人遗憾的是质数的分布是没有规律的,往往让人莫名其妙。如:101、401、601、701都是质数,但上下面的301(7*43)和901(17*53)却是合数。
这样解决一个判断某些数是不是质数是让科学家很头疼的事情。

Description

质数(prime number)又称素数,有无限个。一个自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。
目前为止,人们未找到一个公式可求出所有质数。
2016年1月,发现世界上迄今为止最大的素数,长达2233万位,如果用普通字号将它打印出来长度将超过65公里。
我们不希望您能打破这个记录(It's impossible!)
但是我们可以通过一些特殊的算法判断出出在0~2^32-1之间的若干个数是不是质数,"是"用"TRUE",“否“用“FALSE“当然为了统计方便最后还需要共计的素数和合数。

Format

Input

共N+1行
第1行:输入一个数N表示共有N个待测的数据
第2行到第N+2行:每行读入1个自然数(在0~2^32-1之间)

Output

共N+1行,
第1行至第N行,第i行表示第i个数据是否为数"是"用"TRUE",“否“用“FALSE“
第N+1行有两个正整数表示质数的数目和合数的数目

Sample 1

Input

2
10
5

Output

FALSE
TRUE
1 1

Limitation

1s, 1024KiB for each test case.

Hint

由于读入数据比较长c++的选手请使用读入优化,不清楚自行百度,如果按照此T系不属数据原因
注意:0和1不是质数也不是合数
对于30%的数据N<=20,读入的数在0~2^15-1
对于50%的数据N<=50000 读入的待测数据在0~2^32-1之间
对于100%数据N<=450000,读入的待测数据在0~2^32-1之间
随机生成程序:

var n,i:longint;
begin
assign(output,'aa.txt');
rewrite(output);
 randomize;
 readln(n);
 if n mod 2=1 then begin
  writeln(n+2);
  writeln(1);
  writeln(0);
 end
 else writeln(n);
 for i:=1 to n do writeln(random(maxlongint-1));
close(output);
end.