试题描述
现在有一大堆数,请你对这些数进行检验。
输入
第一行:CAS,代表数据组数(不大于500000),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对于每个数字检验是否是质数。
输出
共一行,输出质数的数量,保证是在64位长整形范围内的正数。
输入示例
4 2 3 5 4
输出示例
3
其他说明
数据范围: 保证cas<=100000,保证所有数字均在64位长整形范围内。 请尽量优化你的程序,包括OI优化。 欢迎暴力法不服来辩呦→ →

首先有这样一个定理:

若p是一个质数,x是一个整数,且x^2 mod p = 1,那么x ≡ ±1 (mod p)。

证明:x^2 mod p = 1       ->       p | x^2 - 1        ->       p | (x - 1)(x + 1),又因为p是质数故x-1与x+1中有一个是p的倍数。

但这个定理的逆定理是个假命题,不过它很少有反例。我们就可以利用逆定理来判定素数了。

设待测数为n,任取一个比n小的正整数a,设 n - 1 = r * 2^s,若n是质数则以下条件至少有一个成立:
1.a^s mod n = 1

2.存在一个整数i满足:0<=i<s且a^(d*(2^i)) mod n = -1

重复以上步骤3至4次即可稳定出解。

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define rep(s,t) for(int i=s;i<=t;i++)
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
typedef long long ll;
ll pow(ll n,ll m,ll p) {
ll ans=,t=n;
while(m) {
if(m&) (ans*=t)%=p;
(t*=t)%=p;m>>=;
}
return ans;
}
int check(ll a,ll n,ll r,ll s) {
ll ans=pow(a,r,n);if(ans==) return ;
rep(,s) {
if(ans==n-) return ;
(ans*=ans)%=n;
}
return ;
}
int isprime(ll n) {
if(n==) return ;
if(n<=||!(n&)) return ;
int r=n-,s=;
while(!(r&)) r>>=,s++;
rep(,) if(check(rand()%(n-)+,n,r,s)) return ;
return ;
}
int main() {
int T=read(),ans=;
while(T--) ans+=isprime(read());
printf("%d\n",ans);
return ;
}

COJ0700 数学(一)的更多相关文章

  1. 数学思想:为何我们把 x²读作x平方

    要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ...

  2. 速算1/Sqrt(x)背后的数学原理

    概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ...

  3. MarkDown+LaTex 数学内容编辑样例收集

    $\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...

  4. 深度学习笔记——PCA原理与数学推倒详解

    PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ...

  5. Sql Server函数全解<二>数学函数

    阅读目录 1.绝对值函数ABS(x)和返回圆周率的函数PI() 2.平方根函数SQRT(x) 3.获取随机函数的函数RAND()和RAND(x) 4.四舍五入函数ROUND(x,y) 5.符号函数SI ...

  6. *HDU 2451 数学

    Simple Addition Expression Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. 如何解决Maple的应用在数学中

    对任意数学和技术学科的研究员.教师和学生而言,Maple是一个必备的工具.通过Maple,教师将复杂数学问题注入生命,学生的精力集中在概念理解上而不是如何使用工具上,研究员可以开发更复杂的算法或模型. ...

  8. 如何让Maple中的数学引擎进入你的桌面应用程序和网站

    MapleNET数学服务套件将Maple 2015强大的数学引擎引入您的应用程序和网站.使用MapleNET,您可以添加数学计算和可视化功能到网页和桌面程序中,通过互联网/局域网分享“活”的Maple ...

  9. 【原创】开源Math.NET基础数学类库使用(07)常用的数学物理常数

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 1.前 ...

随机推荐

  1. JS 保留小数点后面2位小数

    1. 最笨的办法....... [我就怎么干的.........] function get(){    var s = 22.127456 + "";    var str = ...

  2. shell脚本批量生成配置文件

    如果管理的站点和服务器较多的情况下,每次修改配置文件都相当痛苦.因而想到了用shell脚本来批量生成配置文件和配置数据.下面这个脚本是为了批量生成nagios监控配置文件的一个shell脚本程序.其原 ...

  3. Android 返回桌面的Intent

    Intent MyIntent = new Intent(Intent.ACTION_MAIN); MyIntent.addCategory(Intent.CATEGORY_HOME); startA ...

  4. wget 增加单个文件下载限制大小

    增加了参数 -M --limit-size 使用方法 -M 5m 或者 -M 500k 或者 --limit-size=5m 或者 --limit-size=500k 下载地址 http://pan. ...

  5. 【回溯】图的m着色问题

    问题 C: [回溯]图的m着色问题 时间限制: 1 Sec  内存限制: 128 MB提交: 1  解决: 1[提交][状态][讨论版] 题目描述 给定无向连通图G=(V, E)和m种不同的颜色,用这 ...

  6. C++多线程下的单例模式

    一.懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例. 需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread s ...

  7. 大端(big endian)和小端(little endian)

    http://www.cnblogs.com/Romi/archive/2012/01/10/2318551.html 当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的 ...

  8. Nginx(PHP/fastcgi)的PATH_INFO问题

    引用: http://www.laruence.com/2009/11/13/1138.html server { listen 80; server_name localhost; index in ...

  9. Xamarin.Android开发实践(六)

    Xamarin.Android通知详解 一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android ...

  10. Android Studio打包未签名包

    Android Studio打包未签名包 好久没有写技术博客了,真有点懈怠了,作为35岁的程序员,转行重新捡起这些知识,还是挺犹豫纠结的,不过没啥其它办法,一点一滴开始吧,今天这开篇就小结点前几天工作 ...