https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1162

数据范围大约是2^97,需要高精度计算

可以使用pollard-rho算法,期望需要$O((logn)^{1/4})$次整数操作

需要采用 蒙哥马利约化(Montgomery reduction)避免大量取模,并每隔一段时间检查一次gcd。

#include<bits/stdc++.h>
typedef __int128 num;
typedef long long i64;
const int B=,K=;
bool np[B+];
int ps[B],pp=,pps[B],fp=,qp=;
num fs[],P,qs[];
num read(){
num x=;
int c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))x=x*+c-,c=getchar();
return x;
}
void pr(num x){
if(x<)putchar('-'),x=-x;
int ss[],sp=;
do ss[++sp]=x%;while(x/=);
while(sp)putchar(+ss[sp--]);
putchar();
}
num rnd(){
static std::mt19937 mt(time());
num z=mt();
z=z<<^mt();
z=z<<^mt();
return z%(P-)+;
}
const unsigned X=(<<)-;
inline num fix1(num a){return a>=P?a-P:a;}
inline num fix2(num a){return a<?a+P:a;}
inline num mm(num a,num b,num C=){
unsigned b0=b&X;b>>=;
unsigned b1=b&X;b>>=;
unsigned b2=b&X;b>>=;
unsigned b3=b&X;
num c=a*b3%P;
c=((c<<)+a*b2)%P;
c=((c<<)+a*b1)%P;
c=((c<<)+a*b0+C)%P;
return c;
}
num iP,RR,iR;
#define HI(x) u64((x)>>52)
#define LO(x) u64(x&((1ll<<52)-1))
typedef unsigned __int128 u128;
typedef unsigned long long u64;
const num R=num()<<,R1=R-;
__attribute__((optimize("Ofast")))
inline u128 mul(u128 a,u128 b){
u128 m=a*b*iP&R1;
u128 t=(
(u128)HI(a)*HI(b)+
(u128)HI(m)*HI(P)
);
u128 t1=(
(u128)HI(a)*LO(b)+
(u128)LO(a)*HI(b)+
(u128)HI(m)*LO(P)+
(u128)LO(m)*HI(P)
);
u128 t0=(
(u128)LO(a)*LO(b)+
(u128)LO(m)*LO(P)
);
t+=HI(HI(t0)+LO(t1))+HI(t1);
return fix1(t);
}
inline u128 mulRR(u128 a){return mul(a,RR);}
num exgcd(num a,num b,num&x,num&y){
if(!b){x=,y=;return a;}
num g=exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
void setP(num x){
P=x;
exgcd(P,R,iP,iR);
iP=R1&-iP;
iR=fix2(iR);
RR=mm(R%P,R%P);
}
num pw(num a,num n){
num v=;
for(;n;n>>=,a=mm(a,a))if(n&)v=mm(v,a);
return v;
}
bool mr(){
num s=P-;
int r=;
for(;~s&;s>>=,++r);
num a=pw(rnd(),s);
for(;;){
if(a==||a==P-)return ;
if(!--r)return ;
a=mm(a,a);
}
}
bool isp(){
if(P<=B)return !np[P];
if(~P&)return ;
for(int i=;i<;++i)if(!mr())return ;
return ;
}
num gcd(num a,num b){return b?gcd(b,a%b):a;}
num abs(num x){return x>?x:-x;}
void pollard_rho(num n){
setP(n);
if(isp()){
fs[fp++]=n;
return;
}
const int mod=;
for(;;){
num a,b,c,prod=mulRR();
a=b=mulRR(rnd());
c=mulRR(rnd());
for(i64 ii=,k=;;){
a=fix1(mul(a,a)+c);
prod=mul(prod,abs(a-b));
if(!prod){
prod=abs(a-b);
num g=gcd(P,mul(prod,));
if(g==n)break;
if(g!=){
qs[qp++]=g;
qs[qp++]=n/g;
return;
}
}
if(++ii==k)k<<=,b=a;
if(!(ii&mod)){
num g=gcd(P,mul(prod,));
if(g==n)break;
if(g!=){
qs[qp++]=g;
qs[qp++]=n/g;
return;
}
}
}
}
}
void factor(num x){
for(int i=;i<pp;++i){
for(int p=ps[i];x%p==;fs[fp++]=p,x/=p);
}
if(x>)qs[qp++]=x;
while(qp)pollard_rho(qs[--qp]);
std::sort(fs,fs+fp);
for(int i=;i<fp;++i)pr(fs[i]);
}
void init(){
for(int i=;i<=B;++i){
if(!np[i])ps[pp++]=i;
for(int j=;j<pp&&i*ps[j]<=B;++j){
np[i*ps[j]]=;
if(i%ps[j]==)break;
}
}
for(int i=;i<pp;++i){
int p=ps[i],s=;
while(s<=B/p)s*=p;
pps[i]=s;
}
}
int main(){
init();
factor(read());
return ;
}

51nod 1162 质因子分解的更多相关文章

  1. BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]

    1485: [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所 ...

  2. A 洛谷 P3601 签到题 [欧拉函数 质因子分解]

    题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...

  3. P2043 质因子分解

    P2043 质因子分解 题目描述 对N!进行质因子分解. 输入输出格式 输入格式: 输入数据仅有一行包含一个正整数N,N<=10000. 输出格式: 输出数据包含若干行,每行两个正整数p,a,中 ...

  4. POJ1845:Sumdiv(求因子和+逆元+质因子分解)好题

    题目链接:http://poj.org/problem?id=1845 定义: 满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元. 为什么要有乘法逆元呢? 当我们要求(a/b) mod p的 ...

  5. P2043 质因子分解(阶乘的质因数分解)

    P2043 质因子分解 对$n!$进行质因数分解的一种高效算法 首先,筛出$<=n$的素数 蓝后,对$n$反复除以$prime$,同时$cnt+=n/prime$ $n!$中含有该$prime$ ...

  6. Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)

    题意: 找出一个集合中的最大独立集,任意两数字之间不能是素数倍数的关系. 思路: 最大独立集,必然是二分图. 最大数字50w,考虑对每个数质因子分解,然后枚举所有除去一个质因子后的数是否存在,存在则建 ...

  7. luogu P2043 质因子分解

    题目描述 对N!进行质因子分解. 输入输出格式 输入格式: 输入数据仅有一行包含一个正整数N,N<=10000. 输出格式: 输出数据包含若干行,每行两个正整数p,a,中间用一个空格隔开.表示N ...

  8. LightOJ1138 —— 阶乘末尾0、质因子分解

    题目链接:https://vjudge.net/problem/LightOJ-1138 1138 - Trailing Zeroes (III)    PDF (English) Statistic ...

  9. LightOJ1336 Sigma Function —— 质因子分解、约数和为偶数

    题目链接:https://vjudge.net/problem/LightOJ-1336 1336 - Sigma Function    PDF (English) Statistics Forum ...

随机推荐

  1. Matlab_ eval 批量定义变量

    本文备忘 Matlab 中批量定义变量的方法. 参考: [1] matlab中批量赋值与声明变量(eval函数) [2] MathWorks eval 缘起与说明 当变量名称多到一定程度时,变量名的管 ...

  2. 面试知识点准备-C++常见问题

    博客园写写格式简单的文章还行,格式一复杂就不行了,可能是我不会用吧,我有强迫症,有道云格式很好用,以后去有道写这种东西了 有道云笔记链接:http://note.youdao.com/noteshar ...

  3. Jenkins强制语言设置

    最近对照各种Jenkins的教程,发现在jenkins的页面中经常会中英文混合,每个人根据各自系统的不同也会出现语言不同,虽然可以翻译过来,但是中英文的混合差异还是蛮大的,造成项目间沟通障碍. 所以, ...

  4. IOS 生成静态库文件(.framework)

    http://blog.csdn.net/zwl492454828/article/details/55095422

  5. Mathematica求微分换元

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2017/12/16 有时我们需要对PDEs中的各项进行变量替换,比如把$\frac{\text{d}}{\text{d ...

  6. 炸金花游戏(3)--基于EV(期望收益)的简单AI模型

    前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...

  7. padding填充属性

    内边距属性: 设置元素的内容与边框之间的距离. 分4个方向(上右下左): padding-top padding-right padding-bottom padding-left 说明:值不能为负值 ...

  8. adb 安装安卓包

    1.搭建安卓环境,或者下载安装ADB工具 2.adb version检查是否安装成功 3.用数据线连上手机,并在手机中打开USB调试模式,使用adb devices 查看链接的设备 这样表示成功连接上 ...

  9. Windows下部署Apache RocketMQ

    一:环境准备: Windows.JDK1.8+.Maven.Git 二:RocketMQ准备:  1.http://rocketmq.apache.org/release_notes/release- ...

  10. Linux创建用户与权限赋值

    1.设置文件的权限 1).解说: d:是英语directory的缩写,表示“目录”.就是说这是一个目录. l:是英语link的缩写,表示“链接”.就是说这是一个链接. b:块设备文件 c:字符设备 s ...