题目描述

判定输入的数是不是质数。

输入格式

若干行,一行一个数 x。

行数不超过 1.5×104​​。

输出格式

对于输入的每一行,如果 x 是质数输出一行 Y,否则输出一行 N。

样例

样例输入

1
2
6
9
666623333

样例输出

N
Y
N
N
Y

数据范围与提示

1≤x≤1018​​。

欢迎hack(如果你不是管理员,可以在题目讨论区发帖)。

Solution:

  本题Miller-rabin模板题。

  Miller-rabin其实是个很简单的算法,用来快速判断一个数是否为素数。

  前置技能:二次探测定理。

    若$a^2\equiv 1\mod p$且$p$为素数,则$a\equiv \pm 1\mod p$。

    证明:$\because a^2\equiv 1\mod p$

              $\therefore (a+1)(a-1)\equiv 0 \mod p$

        又$p$为素数

        $\therefore a=1$或$a=p-1$

  我们由费马小定理,若$p$为素数,则$a^{p-1}\equiv 1 \mod p$,那么对于一个需要判断是否为素数的数$x$:

    1、$x$必须是个非$1$的奇数。

    2、令$x=2^k*c+1$($c$为奇数),选择随机数$a$,使其满足所有$i<r$,都有$a^{2^i*c}\;mod\;p=p-1\;or\;1$。

  然后就是模拟上述过程,多选几个随机数,若都能通过测试就是素数啦。

  一般的话,随机选取4个数$2,3,5,7$,则在$2.5*10^{13}$以内唯一一个判断失误的数为$3215031751$。

  然后细节就是当前数不能是所选取的随机数的倍数,否则会误判。

代码:

/*Code by 520 -- 9.10*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int cnt=,tab[]={,,,};
ll n,m; ll Mul(ll x,ll y,ll mod){
ll ans=(x*y-(ll)((long double)x/mod*y+0.5)*mod);
return ans<?ans+mod:ans;
} ll Exp(ll x,ll y,ll mod){
ll ans=;
while(y){
if(y&) ans=Mul(ans,x,mod);
y>>=;
x=Mul(x,x,mod);
}
return ans;
} bool Miller_Rabin(ll &n){
if(n==||n==||n==||n==||n==||n==) return ;
if(n==||n%==||n%==||n%==||n%==||n%==||n%==) return ;
For(i,,cnt) {
RE ll d=n-;
while(!(d&)) d>>=;
RE ll s=Exp(tab[i],d,n);
while(s!=&&s!=n-&&d!=n-) d<<=,s=Mul(s,s,n);
if(s!=n-&&!(d&)) return ;
}
return ;
} int main(){
while(scanf("%lld",&n)!=EOF) putchar(Miller_Rabin(n)?'Y':'N'),putchar('\n');
return ;
}

最新文章

  1. Jmeter响应内容为文件
  2. iOS-MVC模式
  3. PHP笔记——java程序员看懂PHP程序
  4. IPv4 地址分类
  5. C++重要知识点小结---1
  6. Codeforces Round #324 (Div. 2) A. Olesya and Rodion 水题
  7. [翻译]log4net教程
  8. PyQt实现图片中心旋转
  9. Ubuntu 下的环境变量配置
  10. PAT1001
  11. n个List&lt;Map&gt;合并,Map中某属性值相等的value值相加
  12. JS传值和传引用
  13. struts2.1.6教程七、国际化
  14. zzuli 2130: hipercijevi 链式前向星+BFS+输入输出外挂
  15. SPI通信协议(非原创,转载他人,用于学习)
  16. Java中日期格式化SimpleDateFormat类包含时区的处理方法
  17. 20170724 Airflow官网资料学习
  18. 可视化工具Navicat的使用
  19. nginx-windows版
  20. LeetCode——Lowest Common Ancestor of a Binary Search Tree

热门文章

  1. CSS3新增特性详解(二)
  2. Linux shell 编写(1)
  3. 统计学习方法c++实现之二 k近邻法
  4. 零基础学python之函数与模块(附详细的代码和安装发布文件过程)
  5. MyEclipse 和 eclipse 最简单的安装Jetty容器插件
  6. Sentence | Never underestimate yourself.
  7. 一个基于NodeJS开发的APP管理CMS系统
  8. 第7讲:SQL Server简介
  9. Beta冲刺第二周王者荣耀交流协会第五次会议
  10. Scurm Meeting 11.2