【数论】Prime Time UVA - 10200 大素数 Miller Robin 模板
题意:验证1~10000 的数 n^n+n+41 中素数的个数。每个询问给出a,b 求区间[a,b]中质数出现的比例,保留两位
题解:质数会爆到1e8 所以用miller robin ,
另外一个优化是预处理
一个坑是四舍五入卡精度。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<ctime>
using namespace std;
typedef long long ll;
const int MAXN = + + ;
const int maxn = MAXN;
#define rep(i,t,n) for(int i =(t);i<=(n);++i)
#define per(i,n,t) for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a))
int phi[MAXN], prime[MAXN];
struct Miller_Rabin
{
int prime[] = { ,,,, };
ll qmul(ll x, ll y, ll mod) {
ll ans = (x*y - (ll)((long double)x / mod * y + 1e-)*mod);
ans = (ans%mod + mod) % mod;
return ans;
}
ll qpow(ll x, ll n, ll mod) {
ll ans = ;
while (n) {
if (n & ) ans = qmul(ans, x, mod);
x = qmul(x, x, mod);
n >>= ;
}
return ans;
}
bool isprime_std(ll p) {
if (p < ) return ;
if (p != && p % == ) return ;
ll s = p - ;
while (!(s & )) s >>= ;
for (int i = ; i < ; ++i) {
if (p == prime[i]) return ;
ll t = s, m = qpow(prime[i], s, p);
while (t != p - && m != && m != p - ) {
m = qmul(m, m, p);
t <<= ;
}
if (m != p - && !(t & )) return ;
}
return ;
}
bool isprime(ll p) {
if (p< || (p != && p % == )) return false;
for (int i = ; i < ; ++i)
{
if (p == prime[i]) return true;
ll t = qpow(prime[i], p - , p);
if (t != ) return false;
}
return true;
}
}mr;
int tot;
void get_phi()
{
phi[] = ;
for (int i = ; i <= MAXN - ; i++) {
if (!phi[i]) {
phi[i] = i - ;
prime[++tot] = i;
}
for (int j = ; j <= tot && 1LL * i*prime[j] <= MAXN - ; j++) {
if (i%prime[j]) phi[i*prime[j]] = phi[i] * (prime[j] - );
else {
phi[i*prime[j]] = phi[i] * prime[j];
break;
}
}
}
}
int isntp[maxn];
void sieve(int n) {
int m = (int)sqrt(n + 0.5);
mmm(isntp, );
rep(i, , m)if (!isntp[i])for (int j = i * i; j <= n; j += i)isntp[j] = ; }
int ans[maxn];
int s[maxn];
int smain();
//#define ONLINE_JUDGE
int main() { //ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
FILE *myfile;
myfile = freopen("C:\\Users\\acm-14\\Desktop\\test\\b.in", "r", stdin);
if (myfile == NULL)
fprintf(stdout, "error on input freopen\n");
FILE *outfile;
outfile = freopen("C:\\Users\\acm-14\\Desktop\\test\\out.txt", "w", stdout);
if (outfile == NULL)
fprintf(stdout, "error on output freopen\n");
long _begin_time = clock();
#endif
smain();
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return ;
}
int smain()
{ int t;
int a, b; s[] = ;
rep(i, , 1e4) {
if (mr.isprime_std(i * i + i + ))s[i] = s[i - ] + ;
else s[i] = s[i - ];
}
while (cin >> a >> b)
{
int cnt = ;
/*rep(i, a, b) {
if (i * i + i + 41 < 1e7) {
if (isntp[i * i + i + 41] == 0)cnt++;
else if(mr.isprime(i * i + i + 41))cnt++;
}
}*/
cnt = s[b];
if (a != )cnt -= s[a - ];
double ans = (double)cnt / (double)(b - a + ) * ;
ans = (double)((int)(ans + 0.50000001)); printf("%.2lf\n", ans/);
}
//cin >> t;
return ;
}
/*
0 39
0 40
39 40
*/
【数论】Prime Time UVA - 10200 大素数 Miller Robin 模板的更多相关文章
- Prime Time UVA - 10200(精度处理,素数判定)
Problem Description Euler is a well-known matematician, and, among many other things, he discovered ...
- [ACM] POJ 2689 Prime Distance (筛选范围大素数)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12811 Accepted: 3420 D ...
- Project Euler 97 :Large non-Mersenne prime 非梅森大素数
Large non-Mersenne prime The first known prime found to exceed one million digits was discovered in ...
- FZU 1649 Prime number or not米勒拉宾大素数判定方法。
C - Prime number or not Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- Miller Robin大素数判定
Miller Robin算法 当要判断的数过大,以至于根n的算法不可行时,可以采用这种方法来判定素数. 用于判断大于2的奇数(2和偶数需要手动判断),是概率意义上的判定,因此需要做多次来减少出错概率. ...
- POJ 1811 大素数判断
数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #inc ...
- Miller_Rabbin大素数测试
伪素数: 如果存在和n互素的正整数a满足a^(n-1)≡1(mod n),则n是基于a的伪素数. 是伪素数但不是素数的个数是非常非常少的,所以如果一个数是伪素数,那么他几乎是素数. Miller_Ra ...
- 计蒜客 18492.Upside down primes-米勒拉宾判大素数 (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 K)
K. Upside down primes 传送门 这个题就是把大数按字符串输进去,判断一下是不是素数,然后反转180度,先判断反转之后的东西是不是一个数,如果是的话,再把这个数判一下是不是素数,如果 ...
- 重复造轮子之RSA算法(一) 大素数生成
出于无聊, 打算从头实现一遍RSA算法 第一步, 大素数生成 Java的BigInteger里, 有个现成的方法 public static BigInteger probablePrime(int ...
随机推荐
- 【Android】详解Android 网络操作
目录结构: contents structure [+] 判断网络 判断是否有网络连接 判断WIFI网络是否可用 判断MOBILE网络是否可用 获取当前网络连接的类型信息 监听网络 获取网络信息需要在 ...
- Mac Apache WebServer 服务器配置
前言 Apache 是目前使用最广的 Web 服务器,可以支持各种脚本的执行. Mac 系统自带,无需单独安装,只需要修改几个配置就可以,简单,快捷. 有些特殊的服务器功能,Apache 都能很好的支 ...
- (Java编程思想)Thinking in Java
1. 为什么突然想去研读<Thinking in Java>? 最近终于下定决心撸了一本<Thinking in Java>第四版,虽然在此之前我就久闻这本书的大名,但一直未曾 ...
- (转) mysql中left join,right join,inner join的区别
转自:https://blog.csdn.net/qq_35975416/article/details/78842958 sql查询中有一个非常重要的环节就是表的关联查询,一般使用left join ...
- AI金融知识自学偏量化方向-目录0
前提: 统计学习(统计分析)和机器学习之间的区别 金融公司采用机器学习技术及招募相关人才 了解不同类型的机器学习 有监督学习 vs 无监督学习 迭代和评估 偏差方差权衡 结合有监督学习和无监督学习(半 ...
- Java如何从服务器获取文件大小?
在Java编程中,如何从服务器获取文件大小? 以下示例演示如何从服务器获取文件大小. package com.yiibai; import java.net.URL; import java.net. ...
- Java如何匹配列表中的电话号码?
在Java编程中如何匹配列表中的电话号码? 以下示例显示如何使用phone.matches(phoneNumberPattern)方法将列表中的电话号码与指定模式相匹配. package com.yi ...
- (实用)CentOS 6.3更新内置Python2.6
在安装Kilo版的OpenStack时,我们发现社区已经将Python升到2.7,而CentOS 6.3上仍然在使用2.6版的Python.本文记录将CentOS 6.3内置的Python2.6更新为 ...
- 随笔:JS对象无new构造原理
var myFun = function(words) { if (!(this instanceof myFun)) { return new myFun(words); } this.name = ...
- Java 8 并发性基础
https://www.ibm.com/developerworks/cn/java/j-jvmc2/index.html http://www.nurkiewicz.com/2013/05/java ...