HDU-2138-How many prime numbers(Miller-Rabin新解法)
题目传送门
sol1:普通判到sqrt(n)的素数判定,不多说了。
- 素数判定
#include "bits/stdc++.h"
using namespace std;
bool is_prime(int n) {
for (int i = ; 1LL * i * i <= n; i++)
{
if (n % i == ) return false;
}
return true;
}
int main() {
int n, m;
while (~scanf("%d", &n)) {
int cnt = ;
for (int i = ; i <= n; i++) {
scanf("%d", &m);
if (is_prime(m)) cnt++;
}
printf("%d\n", cnt);
}
return ;
}复杂度sqrt(m),判断n次就是n * sqrt(m);
sol2:新get到的技巧Miller-Rabin素数测试,结合了费马小定理和二次探测定理,可以更高效的判断素数,存在误判可能,不过误判可能非常小,可以忽略不计;
- Miller-Rabin素数测试
#include "bits/stdc++.h"
using namespace std;
int quick_pow(int n, int k, int p) {
int ans = ;
while (k) {
if (k & ) ans = 1LL * ans * n % p;
n = 1LL * n * n % p;
k >>= ;
}
return ans;
}
bool is_prime(int n) {
// if (n < 2) return false;
int s = , t = n - ;
while (!(t & )) s++, t >>= ;
for (int i = ; i <= ; i++) {
int a = rand() % (n - ) + ;
int k = quick_pow(a, t, n);
for (int j = ; j <= s; j++) {
int x = 1LL * k * k % n;
if (x == && k != && k != n - ) return false;
k = x;
}
if (k != ) return false;
}
return true;
}
int main() {
int n, m;
srand(time(NULL));
while (~scanf("%d", &n)) {
int cnt = ;
for (int i = ; i <= n; i++) {
scanf("%d", &m);
if (is_prime(m)) cnt++;
}
printf("%d\n", cnt);
}
return ;
}复杂度logm,判断n次就是n * log(m);
附加一个用于 LL 范围素数测试的模板:s
- Miller-Rabin素数测试 LL 范围模板
typedef long long LL;
LL quick_mul(LL n, LL k, LL p) {
LL ans = ;
while (k) {
if (k & ) ans = (ans + n) % p;
n = (n + n) % p;
k >>= ;
}
return ans;
}
LL quick_pow(LL n, LL k, LL p) {
LL ans = ;
while (k) {
if (k & ) ans = quick_mul(ans, n, p);
n = quick_mul(n, n, p);
k >>= ;
}
return ans;
}
bool is_prime(LL n) {
if (n < ) return false;
LL s = , t = n - ;
while (!(t & )) s++, t >>= ;
for (int i = ; i <= ; i++) {
LL a = rand() % (n - ) + ;
LL k = quick_pow(a, t, n);
for (int j = ; j <= s; j++) {
LL x = quick_mul(k, k, n);
if (x == && k != && k != n - ) return false;
k = x;
}
if (k != ) return false;
}
return true;
}大致差不多,为了防止爆 LL 加了一个快速积用于乘, 所以复杂度变成了log(m) * log(m)
HDU-2138-How many prime numbers(Miller-Rabin新解法)的更多相关文章
- HDOJ(HDU) 2138 How many prime numbers(素数-快速筛选没用上、)
Problem Description Give you a lot of positive integers, just to find out how many prime numbers the ...
- HDU 2138 How many prime numbers(Miller_Rabin法判断素数 【*模板】 用到了快速幂算法 )
How many prime numbers Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 2138 How many prime numbers
米勒罗宾素数测试: /* if n < 1,373,653, it is enough to test a = 2 and 3. if n < 9,080,191, it is enoug ...
- HDU 2138 How many prime numbers (判素数,米勒拉宾算法)
题意:给定一个数,判断是不是素数. 析:由于数太多,并且太大了,所以以前的方法都不适合,要用米勒拉宾算法. 代码如下: #include <iostream> #include <c ...
- 【HDU】2138 How many prime numbers
http://acm.hdu.edu.cn/showproblem.php?pid=2138 题意:给n个数判断有几个素数.(每个数<=2^32) #include <cstdio> ...
- hdu 5108 Alexandra and Prime Numbers(水题 / 数论)
题意: 给一个正整数N,找最小的M,使得N可以整除M,且N/M是质数. 数据范围: There are multiple test cases (no more than 1,000). Each c ...
- hdu 5108 Alexandra and Prime Numbers
数论题,本质是求出n的最大质因子 #include<time.h> #include <cstdio> #include <iostream> #include&l ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- POJ1811- Prime Test(Miller–Rabin+Pollard's rho)
题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
随机推荐
- 吴裕雄--天生自然MySQL学习笔记:MySQL 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成 ...
- opencv python图片编码解码
cv2.imdecode()函数从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像.cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值到 ...
- 实现3d效果
transform-origin: center left 60px;可以实现3d转换
- JavaScript学习总结(一)
概述 前端三剑客,html.css.js. 这三种语言基本是前端开发必备的东西,那么你知道这三种语言分别负责的功能是什么吗? html:负责了一个页面的结构 css:负责页面的样式 JavaScrip ...
- Spring DATA Neo4J(一)
Spring DATA Neo4J——简介 Spring Framework提供了一下模块来处理基于Java的应用程序的DAO层 Spring JDBC Spring ORM Spring DATA ...
- mac下使用opencv编译安装新模块contrib
opencv-4.0.1 opencv_contrib-4.0.1 提供ippicv下载链接: https://pan.baidu.com/s/1OIJRUqPqAtpMetku8qX36w cont ...
- 同步nginx日志到s3 bulket
1.此处用的是增量同步 #!/bin/bash rm -rf /var/log/nginx/access.log.*.* local_host="`hostname --i`" a ...
- MySQL-慢日志slow log
文件结构 1.目录结构 drwxrwxr-x mysql mysql Mar bin drwxrwxr-x mysql mysql Dec : binlogdir -rw-r--r-- mysql m ...
- 03 Mybatis:01.Mybatis课程介绍及环境搭建&&02.Mybatis入门案例
mybatis框架共四天第一天:mybatis入门 mybatis的概述 mybatis的环境搭建 mybatis入门案例 -------------------------------------- ...
- LGOJ1344 追查坏牛奶
Description link 题意概述:给一张图,每条边有边权,求让点 \(1\) 和点 \(n\) 不连通的"最小破坏边权和" 和 "在此基础上的最小破坏边数&qu ...