【HDU】2138 How many prime numbers
http://acm.hdu.edu.cn/showproblem.php?pid=2138
题意:给n个数判断有几个素数。(每个数<=2^32)
- #include <cstdio>
- using namespace std;
- typedef long long ll;
- ll ipow(ll a, ll b, ll m) { ll x=1; for(; b; b>>=1, (a*=a)%=m) if(b&1) (x*=a)%=m; return x; }
- ll rand(ll a, ll b) {
- static const ll M=1e9+7, g=154865266;
- static ll now=1283901ll;
- return a+((now*=g)%=M)%(b-a+1);
- }
- bool check(ll x) {
- if(x==2 || x==3 || x==5 || x==7 || x==11 || x==13) return 1;
- if(x<2 || (x&1)==0 || (x%3)==0 || (x%5)==0 || (x%7)==0 || (x%11)==0 || (x%13)==0) return 0;
- int cnt=0;
- ll d=x-1; while((d&1)==0) d>>=1, ++cnt;
- for(int T=1; T<=50; ++T) {
- int a=rand(2, x-1);
- ll t=ipow(a, d, x), pre;
- for(int i=1; i<=cnt; ++i) { pre=t; (t*=t)%=x; if(t==1 && pre!=1 && pre!=x-1) return 0; }
- if(t!=1) return 0;
- }
- return 1;
- }
- int main() {
- int n;
- while(~scanf("%d", &n)) {
- int ans=0;
- for(int i=1; i<=n; ++i) { int a; scanf("%d", &a); if(check(a)) ++ans; }
- printf("%d\n", ans);
- }
- return 0;
- }
学习了素数检测= =Miller-Rabin...复杂度$O(k log^3 n)$,k是选的$a$的个数
其实基于两个定理:费马小定理和二次探测...
首先如果$n$是奇素数,那么显然对于所有的$1 \le a < n$,都有$a^{(n-1)} \equiv 1 \pmod{n}$,那么我们马上可以得到一个暴力算法= =(比枚举约数还慢系列= =
然后用那啥二次探测定理然后随机选一些$a$然后一定概率来检测$n$= =(听说单次检测是$3/4$的概率= =那么多次检测成功率很高= =$n$次的能检测出来的概率就是$1 - \left( \frac{1}{4} \right) ^n$
二项探测就是指如果$n$是素数,则$x^2 \equiv 1 \pmod{n}, 0<=x<n$的只有就是$x = 1 或 x = n-1$
证明:容易得到$p | (x+1)(x-1)$。而由于$p$是质数,所以$(x+1)$和$(x-1)$中至少一个被$p$整除。那么容易得到$x = \pm 1$,即$x \equiv 1 或 x \equiv n-1$
然后我们就将$n-1$分解成$2^sd$其中$d$为奇数。这样我们从$a^d$开始向上算,每一次平方一次,如果等于$1$而上一次却不等于$\pm 1$,那么为合数。
【HDU】2138 How many prime numbers的更多相关文章
- 【HDU】2866:Special Prime【数论】
Special Prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 【POJ2739】Sum of Consecutive Prime Numbers
简单的素数打表,然后枚举.开始没注意n读到0结束,TLE了回..下次再认真点.A过后讨论里面有个暴力打表过的,给跪了! #include <iostream> #include <c ...
- 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...
- 【LeetCode】201. Bitwise AND of Numbers Range 解题报告(Python)
[LeetCode]201. Bitwise AND of Numbers Range 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/prob ...
- 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 ...
- 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】2191 多重背包问题
原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...
- 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交
[题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...
- 【HDU】6148 Valley Numer 数位DP
[算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...
随机推荐
- DHCP的若干原理解释
转自:http://blog.chinaunix.net/uid-22287947-id-1775641.html 搜罗了几种关于dhcp的原理和过程解释 DHCP(Dynamic Host Conf ...
- PHP类方法重写原则
可能我们日常工作中很少用到这块知识点,但我还是喜欢把遇到的却不清楚的知识点摸清 PHP的类方法重写规则 1.final修饰的类方法不可被子类重写 final修饰的类方法不可被子类重写 即便final ...
- 攻城狮在路上(叁)Linux(十五)--- 文件与目录的默认权限与隐藏权限
一.文件默认权限:umask <==需要被减去的权限. 1.umask指的是当前用户在新建文件或者目录时的默认权限,如0022; 2.默认情况下,用户创建文件的最大权限为666; 创建目录的最大 ...
- android 入门-Service
sdk 1.7 package com.example.hellowrold; import java.util.Random; import com.example.hellowrold.R.id; ...
- 【leetcode】Single Number && Single Number II(ORZ 位运算)
题目描述: Single Number Given an array of integers, every element appears twice except for one. Find tha ...
- Android开发如何去除标题栏title(转)
去除标题栏title其实非常简单,他有两种方法,一种是在代码中添加,另一种是在AndroidManifest.xml中添加: 1.在代码中实现:在此方法setContentView(R.layout. ...
- 串口编程 tcflush()函数 (转)
tcflush函数刷清(扔掉)输入缓存(终端驱动法度已接管到,但用户法度尚未读)或输出缓存(用户法度已经写,但尚未发送). int tcflush(int filedes,int quene) qu ...
- android如何实现文件按时间先后顺序排列显示
<span style="font-size:18px;">File[] files =parentFile.listFiles(fileFilter);//通过fil ...
- codeforces 286 div2 B
思路:质因子累乘的值即为所求#include<iostream> #include<algorithm> #include<stdio.h> #include< ...
- 分数try catch
要求:编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”.“及格”.“中”.“良”.“优”的结论.要求程序必须具备足够的健壮性,不管用户输入什 么样的内容 ...