分解大质数模板(复杂度小于sqrt(n))
//POJ 1811
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <time.h> using namespace std; typedef __int64 lld; lld ran() {
return rand() << 16 | rand();
} lld gcd(lld a, lld b) {
return !b ? a : gcd(b, a % b);
}
inline void add(lld &x, lld ad, lld mod) {
x += ad;
if (x >= mod) x -= mod;
}
lld mul_mod(lld a, lld b, lld mod) {
lld ret = 0;
while (b) {
if (b & 1) {
add(ret, a, mod);
}
b >>= 1; add(a, a, mod);
}
return ret;
}
lld pow_mod(lld x, lld n, lld mod) {
lld ret = 1 % mod;
while (n) {
if (n & 1) {
ret = mul_mod(ret, x, mod);
}
n >>= 1; x = mul_mod(x, x, mod);
}
return ret;
}
bool test(lld n, lld b) {
lld m = n - 1;
int counter = 0;
while (~m & 1) {
m >>= 1;
counter ++;
}
lld ret = pow_mod(b, m, n);
if (ret == 1 || ret == n - 1) {
return true;
}
counter --;
while (counter >= 0) {
ret = mul_mod(ret, ret, n);
if (ret == n - 1) {
return true;
}
counter --;
}
return false;
}
const int BASE[12] = {2,3,5,7,11,13,17,19,23,29,31,37};
bool is_prime(lld n) {
if (n < 2) {
return false;
}
if (n < 4) {
return true;
}
if (n == 3215031751LL) {
return false;
}
for (int i = 0; i < 12 && BASE[i] < n; i++) {
if (!test(n, BASE[i])) {
return false;
}
}
return true;
}
lld pollard_rho(lld n, lld seed) {
lld x, y, head = 1, tail = 2;
x = y = ran() % (n - 1) + 1;
while (true) {
x = mul_mod(x, x, n);
add(x, seed, n);
if (x == y) {
return n;
}
lld d = gcd(x > y ? x - y : y - x, n);
if (1 < d && d < n) {
return d;
}
head ++;
if (head == tail) {
y = x;
tail <<= 1;
}
}
}
vector <lld> divisors;
void factorize(lld n) {
if (n > 1) {
if (is_prime(n)) {
divisors.push_back(n);
}else {
lld d = n;
while (d >= n) {
d = pollard_rho(n, ran() % (n - 1) + 1);
}
factorize(n / d);
factorize(d);
}
}
} int main() {
//srand(time(NULL));
int T;
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++) {
lld x;
scanf("%I64d", &x);
if (is_prime(x)) {
printf("Prime\n");
}else {
divisors.clear();
factorize(x);
sort(divisors.begin(), divisors.end());
printf("%I64d\n", divisors[0]);
}
}
return 0;
}
分解大质数模板(复杂度小于sqrt(n))的更多相关文章
- 统计无向图中三角形的个数,复杂度m*sqrt(m).
统计无向图中三角形的个数,复杂度m*sqrt(m). #include<stdio.h> #include<vector> #include<set> #inclu ...
- 素数筛 codevs 1675 大质数 2
1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小明因为没做作业而被数学 ...
- codevs——1530 大质数
1530 大质数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师 ...
- codevs——1675 大质数 2
1675 大质数 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 小明因为没做作业而被数学老师罚站,之 ...
- [hdu5351]找规律,大整数模板
题意:f(1)="a",f(2)="b",f(i)=f(i-1)+f(i-2),"+"表示连接符.给定n,m,求f(n)的前m个字符的“ne ...
- Pollard Rho大质数分解学习笔记
目录 问题 流程 代码 生日悖论 end 问题 给定n,要求对n质因数分解 普通的试除法已经不能应用于大整数了,我们需要更快的算法 流程 大概就是找出\(n=c*d\) 如果\(c\)是素数,结束,不 ...
- codevs 2530大质数
链接:http://codevs.cn/problem/1530/ 解题思路: 这个题最关键的剪枝还是 因子小于平方根,但不是像原来那样用. 逆转思维,与其说判断哪些是质数,不如说判断哪些不是质数,更 ...
- 湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30746#problem/D D - 平方根大搜索 UVA12505 - Searchin ...
- 4招搞定项目年终总结,还有9大PPT模板免费送
作为一名合格的项目经理 一到年末,我们的头等大事就来了 那就是写项目年终总结和计划 但是………初入这行的项目经理有点犯难,因为 不 会 写 不用怕,小编送你年终总结秘籍和好看的PPT模板 先来看秘 ...
随机推荐
- [iOS 视频流开发-获得视频帧处理]
调用视频流所使用框架:<Foundation/Foundation.h> 必须定义的参数: 1.AVCaptureDevice(捕获设备:前置.后置摄像头等) 2.AVCaptureInp ...
- Androidstudio 的svn配置 需要忽略的目录
- ASP.NET MVC 4入门
一.MVC设计模式将Web应用分解成三个部分:模型(Models).试图(Views)和控制器(Controllers),这三部分分别完成不同的功能以实现Web应用. 视图(View)代表用户交互界面 ...
- Parallel Computing–Cannon算法 (MPI 实现)
原理不解释,直接上代码 代码中被注释的源程序可用于打印中间结果,检查运算是否正确. #include "mpi.h" #include <math.h> #includ ...
- javascript 代码可读性
可读性的大部分内容都是和代码缩进相关的,必须保证代码有良好的格式.可读性的另一方面就是注释,一般而言,有如下一些地方需要进行注释 1.1.1 函数和方法 每个函数或方法都应该包含一个注释,描述其目的和 ...
- NOIp DP 1003 爆零记
6道DP题只拿了220分,NOIp我不滚粗谁滚粗? 考试历程貌似并没有什么可说的QAQ,就是不停的来回推方程和写崩的状态中. 正经题解 六道题其实除了第六道比较恶心..其他的都还算可以. truck ...
- 【转】python编码规范
http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1) 打开项目的Property Pages对话框 2) 点击左侧C/C ...
- HTML学习体会
HTML介绍 华丽的网页界面,都是由静态网页和一些动态效果,插入的视频,和flash等等,不得不说,静态网页的制作,是学习网页的必经之路,可见静态网页在学习网页的前端是十分重要.静态网页主要是通过ht ...
- CSS 图片加载完成再淡入显示
一.方法 加载完成再显示:借助Image对象的onload事件,加载完时再把src赋给img标签的src: 淡人显示:起始opacity为0,利用transform过度到1 二.代码 <!DOC ...