【数论】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 ...
随机推荐
- C#通过DSOFile读取与修改文件的属性
搜了一圈用C#读取与修改文件属性的文章,结果几乎找不到- -: 偶然间看到一个DSOFile工具,然后找到了对该工具进行详细讲解的一篇文章:<DSOfile,一个修改windows系统文件摘要的 ...
- arcgis server瓦片行列号计算
2013-08-01 arcgis server切图时会设置一个原点坐标,如果是经纬度坐标一般默认(x0,y0)=(-400,400)作为切图的起始点,即从这开始算行列号.假设切图的地图某点坐标为x, ...
- 用.NET CORE做项目,VS里编译碰到‘。。。。包降级。。。。’错误
用.NET CORE做项目,VS里编译碰到‘....包降级....’错误 本地开发机:WIN10+VS2017 15.7.3 ,用CORE2.1版本的建立一个项目,做好了,传到gitee上 今天有新同 ...
- [ci] jenkins kubernetes插件配置(容器模式)-通过jnlp
有个小伙用sh结合jenkins搞的k8s cicd还不错 jenkins kubernetes插件 首先插件管理,搜索kubernetes plugin安装 配置kubernetes云 配置项目 执 ...
- ④NuPlayer播放框架之Renderer源码分析
[时间:2016-11] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,渲染器,render] 0 导读 之前我们分析了NuPlayer的实现代码,本文将重点聚 ...
- 9最好的JavaScript压缩工具
削减是一个从源代码中删除不必要的字符的技术使它看起来简单而整洁.这种技术也被称为代码压缩和最小化.在这里,我们为你收集了10个最好的JavaScript压缩工具将帮助您删除不必要的空格,换行符,评论, ...
- 批处理命令学习笔记——Start命令
Start 命令 启动另一个窗口运行指定的程序或命令,所有的DOS命令和命令行程序都可以由start命令来调用. 语法:START ["title"] [/Dpath] [/I] ...
- 为什么一点onclick按钮就提交表单?
下面是一个表单,有一个onclick按钮,点击后上面文本框的内容被添加到下面的文本域中,并可以一直添加,然后点击submit后提交到另一个页面.但是,在Ie9或者火狐浏览器中我一点onclick为什么 ...
- oracle数据泵笔记
1.创建目录 查询已有目录:select * from dba_directories 创建并授权: CREATE DIRECTORY dump_dir AS '/tmp/' grant read,w ...
- Java知多少(36)内部类及其实例化
在 Java 中,允许在一个类(或方法.语句块)的内部定义另一个类,称为内部类(Inner Class),有时也称为嵌套类(Nested Class). 内部类和外层封装它的类之间存在逻辑上的所属关系 ...