Given the number, you are to answer the question: "Is it prime?"

Solutions to this problem can be submitted in C, C++, Pascal, Perl, Python, Ruby, Lisp, Hask, Ocaml, Prolog, Whitespace, Brainf**k and Intercal only.

Input

t – the number of test cases, then t test cases follows. [t <= 500]
Each line contains one integer: N [2 <= N <= 2^63-1]

Output

For each test case output string "YES" if given number is prime and "NO" otherwise.

Example

Input:
5
2
3
4
5
6

Output:
YES
YES
NO
YES
NO

  题目大意是说,给你一个能够用有符号64位整型存储的数,判断它是否是素数。

  用费马小定理,多次随机生成一个底数a,然后n - 1次幂,判断模n意义下是否是1。

  为了充分表示对rand()的嫌弃,于是手写了一个随机数生成器。详细请见[here]

Code

 /**
  * SPOJ
  * Problem#PON
  * Accepted
  * Time:180ms
  * Memory:15360k
  */
 #include<iostream>
 #include<cstdio>
 #include<cctype>
 #include<cmath>
 #include<ctime>
 #include<cstring>
 #include<cstdlib>
 #include<fstream>
 #include<sstream>
 #include<algorithm>
 #include<map>
 #include<set>
 #include<queue>
 #include<vector>
 #include<stack>
 using namespace std;
 typedef bool boolean;
 #define INF 0xfffffff
 #define smin(a, b) a = min(a, b)
 #define smax(a, b) a = max(a, b)
 template<typename T>
 inline boolean readInteger(T& u){
     char x;
     ;
     );
     )  {
         ungetc(x, stdin);
         return false;
     }
     if(x == '-'){
         x = getchar();
         aFlag = -;
     }
     ) + (u << ) + x - ');
     ungetc(x, stdin);
     u *= aFlag;
     return true;
 }

 #define LL long long

 typedef class Random {
     public:
         unsigned int pre;
         unsigned int seed;

         Random():pre(), seed((unsigned) time (NULL)) {    }
         Random(), seed(seed) {    }

         /**
          * Generate a random number.
          * @return this function will return the random number it gernerated
          */
         unsigned int rand() {
 //            unsigned int ret = (seed * 7361238 + seed % 20037 * 1244 + pre * 12342 + 378211) * (seed + 134543);
 //            unsigned int ret = (seed * 7361238 + seed % 20037 * 1244 + pre * 12342 + 378211 + time(NULL) * pre) * (seed + 134543);
             unsigned int ret;
             )
                 ret = (seed *  + seed %  *  + pre *  + (time(NULL) * (pre *  + seed *  + )) + );
             else
                 ret = (seed *  + seed %  *  + pre *  + (time(NULL) * (pre *  + seed *  + )) + );
             pre = seed;
             seed = ret;
             return ret;
         }
 }Random;

 inline void setLLhighBit(long long& x, int a) {
     int* p = (int*)&x;
     *(p + ) = a;
 }

 inline void setLLlowBit(long long& x, int a) {
     int* p = (int*)&x;
     *p = a;
 }

 inline void cleanLLSignFlag(long long& a) {
     a &= (1ull << ) - ;
 }

 template<typename T>
 T mul_mod(T a, T b, T& moder) {
     )    return a;
     T temp = mul_mod(a, b >> , moder);
     )    return (((temp + temp) % moder) + a) % moder;
     return (temp + temp) % moder;
 }

 template<typename T>
 T pow_mod(T a, T pos, T& moder) {
     )    return a;
     T temp = pow_mod(a, pos >> , moder);
     )    return mul_mod(mul_mod(temp, temp, moder), a, moder);
     return mul_mod(temp, temp, moder);
 }

 int T;
 LL n;
 Random r;

 inline void work() {
     readInteger(n);
     ) == ) {
         )    puts("YES");
         else puts("NO");
         return;
     }
     unsigned int l, h;
     LL a, r1;
     ; t < ; t++) {
         l = r.rand();
         h = r.rand();
         setLLhighBit(a, h);
         setLLlowBit(a, l);
         cleanLLSignFlag(a);
         a = (a % (n - )) + ;
         r1 = pow_mod(a, n - , n);
         ) {
             puts("NO");
             return;
         }
     }
     puts("YES");
 }

 int main() {
     readInteger(T);
     while(T--) {
         work();
     }
     ;
 }

SPOJ Prime or Not - 快速乘 - 快速幂的更多相关文章

  1. hdu 5690 2016"百度之星" - 初赛(Astar Round2A) All X 快速二次幂 || 寻找周期

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690 题意:m个数字全为x mod k ?= c;其中m <= 1010,0 < c,k ...

  2. 快速傅里叶变换 & 快速数论变换

    快速傅里叶变换 & 快速数论变换 [update 3.29.2017] 前言 2月10日初学,记得那时好像是正月十五放假那一天 当时写了手写版的笔记 过去近50天差不多忘光了,于是复习一下,具 ...

  3. 整数快速乘法/快速幂+矩阵快速幂+Strassen算法

    快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩 ...

  4. 快速乘法,幂计算 hdu5666

    在实际应用中为了防止数据爆出,在计算a*b%m和x^n%m时,可以采用此方法.在数论中有以下结论: a*b%m=((a%m)*(b*m))%m ; (a+b)%m=(a%m+b%m)%m ; _int ...

  5. 快速乘+快速幂(用于模数超过int范围)

    一般的快速幂并不适合模数大于int范围的情况,因为在乘法运算的过程可能会出现超出long long的情况出现.这个时候可以利用快速幂的思想使用快速乘,原理就是模拟乘法运算,将乘法运算分解成加法运算,再 ...

  6. 第四章 istio快速入门(快速安装)

    4.1 环境介绍 K8s 1.9 以上版本. 4.2 快速部署Istio 下载:  https://github.com/istio/istio/releases/,  下载 1.1.0-snapsh ...

  7. [开源]OSharpNS - .net core 快速开发框架 - 快速开始

    什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...

  8. 模板 - 数学 - 快速傅里叶变换/快速数论变换(FFT/NTT)

    先看看. 通常模数常见的有998244353,1004535809,469762049,这几个的原根都是3.所求的项数还不能超过2的23次方(因为998244353的分解). 感觉没啥用. #incl ...

  9. 快速沃尔什变换&快速莫比乌斯变换小记

    u1s1 距离省选只剩 5 days 了,现在学新算法真的合适吗(( 位运算卷积 众所周知,对于最普通的卷积 \(c_i=\sum\limits_{j+k=i}a_jb_k\),\(a_jb_k\) ...

随机推荐

  1. python的几个注意事项

    ,==============坑======= 1.可变类型的值不要作为函数参数默认值,应该是不可变的对象,如None,True,False,数字或字符串 2.小心+= a = range(10) b ...

  2. Django---管理界面简单设置

    1.设置可选字段 为了设置某一个字段是可选的,不如说email,仅仅须要改动其相关的模型,也就是在model.py中改动模型,将email=models.EmailField(blank=True), ...

  3. 快捷键(SourceInsight)

    选择一块 : Ctrl+-选择一行 : Shift+F6到下一个函数 : 小键盘 +上一个函数 : 小键盘 -高亮当前单词 : Shift+F8回退.前进 alt + , alt + .最后一个窗口 ...

  4. 下载google play上最新版的apk

    注意,是下载最新版的方法,不是像很多网站下的是旧版本 http://techapple.net/2014/09/3-websites-directly-download-apk-google-play ...

  5. 解压赋值及python的一些基础运算

    #解压赋值lis=[11,22,33,44,55] money1,money2,money3,money4,money5=lis print(money1,money2,money3,money4,m ...

  6. js 的each()方法遍历对象和数组

    <script src="../lib/jquery-1.8.3.min.js" ></script> <script type="text ...

  7. 如何修改WordPress网站默认登录地址wp-admin

    使用过WordPress程序建网站的学员都知道,我们使用Wordpress建好的网站,它的网站登录后台就是“网站域名/wp-admin”.如下图: 为了网站安全,如何修改Wordpress网站默认登录 ...

  8. [js]js中原型的继承

    js继承01 思路: 单例/工厂/构造函数--演进到原型 搞清原型结构 原型继承 模拟系统原型继承 实现自己的继承 观察原型继承特点 演进到原型链这一步 //单例模式: 防止变量名冲突: // 思路: ...

  9. hiredis(Synchronous API)

    hiredis是一个小型的client端的c库.它只增加了最小对协议的支持,同时它用一个高级别的printf-alike API为了绑定各种redis命令.除了支持发送和接收命令,它还支持对流的解析. ...

  10. hdu1505City Game(扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1505 题意:R为被占位置,F为空位,求出最大子空矩阵大小*3. 思路:1.悬线法,记录每个位置的悬线能到达的左边 ...