题目大意:给你$m$个数$a_i$,定义$n=\Pi_{i=1}^{m}a_i$。将$n$分解质因数为$\Pi p_i^{k_i} $,$p_i$是质数。请输出$2^{max(k_i)}-1$,以及存在多少个$k_i$,满足$k_i=max(k_i)$。

数据范围:$m≤600$,$a_i≤10^{18} $。

这题有一种很显然的做法,采用$pollard-rho$对每个$a_i$分解质因数,然后统计每种质因子出现的次数,最后取个$max$然后再统计下直接输出。

然而这题卡$pollard-rho$(比如来个$998244353^2$),会$TLE$。

所以要采用一个比较高明的做法。

我们先用线性筛筛出$[1,10^6]$内的质数。

先用这些质数除以每一个$a_i$,并统计这些质数出现的次数。

处理后的$a_i$存在以下几种情况:

1,是数字$1$,无需处理。

2,是一个$>10^6$的质数,我们可以用$Miller-Rabin$来判断,处理很简单。

3,是一个$>10^6$的质数的平方,我们可以先对$a_i$开跟,处理很简单。

4,是多个(其实只能是$2$个)$>10^6$的质数的乘积。

对于第$4$种情况,我们枚举两个不为$1$的$a_i$和$a_j$,求它们的最大公约数。

若它们的最大公约数不为$1$,那么我们就成功地把$a_i$和$a_j$给分解了。

没想到吧!!!!!!

然后就没有然后了

特别注意,此题的答案可能会很大,需要用高精度计算。

 #include<bits/stdc++.h>
#define L long long
#define M 1000005
#define R(x) (1+rand()%(x-1))
#define N 3000
using namespace std;
struct bign{
int a[N+];
bign(){memset(a,,sizeof(a));}
friend bign operator *(bign a,int b){
int s,g=;
for(int i=N;~i;i--){
s=a.a[i]*b+g;
a.a[i]=s%; g=s/;
}
return a;
}
void minus(){
int s,g=;
for(int i=N;~i;i--){
a[i]-=g;
if(a[i]<){a[i]+=; g=;}
else return;
}
}
void out(){
int i=;
while(i<N&&a[i]==) i++;
while(i<=N) printf("%d",a[i]),i++;
}
}a; L mul(__int128 x,__int128 y,__int128 MOD){
__int128 ans;
ans=x*y%MOD;
return ans;
}
L pow_mod(L x,L k,L MOD){
L ans=;
while(k){
if(k&) ans=mul(ans,x,MOD);
x=mul(x,x,MOD); k>>=;
}
return ans;
}
map<L,int> mp;
bool checkprime(L x){
if(x==) return ; if(x<||x%==) return ;
int times=;
while(times--){
L base=R(x-);
if(pow_mod(base,x-,x)!=) return ;
}
return ;
} int pri[M]={},b[M]={},use=,is[M]={};
void pre(){
for(int i=;i<M;i++){
if(!b[i]) pri[++use]=i;
for(int j=;j<=use&&i*pri[j]<M;j++){
b[i*pri[j]]=;
if(i%pri[j]==) break;
}
}
}
L num[M]={},sum=;
void chu(L &x){
for(int i=;i<=use;i++)
while(x%pri[i]==) x/=pri[i],mp[pri[i]]++;
} int main(){
pre();
int n; scanf("%d",&n);
for(int i=;i<=n;i++){
cin>>num[i];chu(num[i]);
if(num[i]==){is[i]=; continue;}
if(checkprime(num[i])) {is[i]=;mp[num[i]]++;}
L hh=sqrt(((long double)num[i]));
if(hh*hh==num[i]) {mp[hh]+=; is[i]=;}
}
for(int i=;i<=n;i++) if(is[i]!=)
for(int j=i+;j<=n;j++)if(is[j]!=){
if(num[i]==num[j]) continue;
L gcd=__gcd(num[i],num[j]);
if(gcd==) continue;
if(is[i]==) {mp[gcd]++; mp[num[i]/gcd]++; is[i]=;}
if(is[j]==) {mp[gcd]++; mp[num[j]/gcd]++; is[j]=;}
}
for(int i=;i<=n;i++) if(is[i]==){
mp[num[i]]++;
mp[-num[i]]++;
}
map<L,int>::iterator it;
int maxn=,cnt=;
for(it=mp.begin();it!=mp.end();it++)
maxn=max(maxn,it->second);
printf("%d\n",maxn);
for(it=mp.begin();it!=mp.end();it++)
if(it->second==maxn) cnt++;
a.a[N]=;
while(cnt--) a=a*;
a.minus();
a.out();
}

【BZOJ2082】【POI2010】Divine divisor 假的pollard-rho的更多相关文章

  1. BZOJ2082 : [Poi2010]Divine divisor

    将所有数分解质因数,那么第一问就是求指数的最大值,第二问就是$2^{指数最大的质数个数}-1$. 首先将$10^6$以内的质因数全部找到,那么剩下部分的因子$>10^6$,且只有3种情况: 1. ...

  2. [POI2010]Divine Divisor

    [POI2010]Divine Divisor 题目大意: 给你\(m(m\le600)\)个数\(a_i(a_i\le10^{18})\).\(n=\prod a_i\).现在要你找到一个最大的\( ...

  3. POJ 1811 Prime Test (Pollard rho 大整数分解)

    题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...

  4. 整数(质因子)分解(Pollard rho大整数分解)

    整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...

  5. Pollard Rho因子分解算法

    有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...

  6. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  7. 初学Pollard Rho算法

    前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...

  8. 【Luogu】P4358密钥破解(Pollard Rho)

    题目链接 容易发现如果我们求出p和q这题就差不多快变成一个sb题了. 于是我们就用Pollard Rho算法进行大数分解. 至于这个算法的原理,emmm 其实也不是很清楚啦 #include<c ...

  9. Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

    \(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...

随机推荐

  1. NSNotificationCenter 注意

    成对出现 意思很简单,NSNotificationCenter消息的接受线程是基于发送消息的线程的.也就是同步的,因此,有时候,你发送的消息可能不在主线程,而大家都知道操作UI必须在主线程,不然会出现 ...

  2. 前端之css笔记2

    1 属性选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  3. 将Tomcat设置为自动启动的服务最快捷方法

    将Tomcat设置为自动启动的服务: 最近遇到了个问题,服务器上的项目突然访问不了,就上服务器去重启了tomcat服务,谁知道到最后tomcat的服务报错了,重新启动服务的选项 也没有,之前这个项目也 ...

  4. 2018.10.02 NOIP模拟 聚会(前缀和)

    传送门 今天的签到题. 直接前缀和处理一下就秒了. 然而考试的时候智障用线段树维护被卡成了30分,交到OJ一测竟然有100? 搞得我都快生无可恋了. 如果用线段树来做可以类比这道题的写法,直接维护区间 ...

  5. Cygwin工具的简单使用

    简介 从使用角度来看:Cygwin就是一个windows软件,该软件就是在windows上仿真linux操作系统.简言之,cygwin是一个在windows平台上运行的 linux模拟环境,使用一个D ...

  6. hdu-1698(线段树,区间修改)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 注意:用位运算会更快,不然超时. #include<iostream> #inclu ...

  7. AirplaceLogger源代码解析

    将源代码添加进Eclipse中,右键-->Import-->Existing Projects into Workspace-->选择AirplaceLogger源代码文件夹即可导入 ...

  8. 最大连续子序列 -- hdu -- 1231

    http://acm.hdu.edu.cn/showproblem.php?pid=1231 最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  9. PAT甲 1001. A+B Format (20) 2016-09-09 22:47 25人阅读 评论(0) 收藏

    1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Calculate ...

  10. 基于MATLAB的RGB转YCBCR色彩空间转换

    使用MATLAB进行图片的处理十分方便,看它的名字就知道了,矩阵实验室(matrix laboratory).一副图片的像素数据可以看成是一个二维数组一个大矩阵,MTABLAB就是为矩阵运算而生. M ...