【BZOJ2082】【POI2010】Divine divisor 假的pollard-rho
题目大意:给你$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的更多相关文章
- BZOJ2082 : [Poi2010]Divine divisor
将所有数分解质因数,那么第一问就是求指数的最大值,第二问就是$2^{指数最大的质数个数}-1$. 首先将$10^6$以内的质因数全部找到,那么剩下部分的因子$>10^6$,且只有3种情况: 1. ...
- [POI2010]Divine Divisor
[POI2010]Divine Divisor 题目大意: 给你\(m(m\le600)\)个数\(a_i(a_i\le10^{18})\).\(n=\prod a_i\).现在要你找到一个最大的\( ...
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
- Pollard Rho因子分解算法
有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- 初学Pollard Rho算法
前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...
- 【Luogu】P4358密钥破解(Pollard Rho)
题目链接 容易发现如果我们求出p和q这题就差不多快变成一个sb题了. 于是我们就用Pollard Rho算法进行大数分解. 至于这个算法的原理,emmm 其实也不是很清楚啦 #include<c ...
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
随机推荐
- KbmMW 认证管理器说明(转载)
这是kbmmw 作者关于认证管理器的说明,我懒得翻译了,自己看吧. There are 5 parts of setting up an authorization manager: A) Defin ...
- js如何实现网站title的滚动效果
var text=document.title;//获得页面的标题 var timerID;//定时器 function newtext() { ...
- 2018.10.17 NOIP模拟 管道(状压dp)
传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...
- 破解Excel密码
https://zhidao.baidu.com/question/98055974.html 方法:1\打开文件2\工具---宏----录制新宏---输入名字如:aa3\停止录制(这样得到一个空宏) ...
- (KMP)剪花布条 -- hdu -- 2087
http://acm.hdu.edu.cn/showproblem.php?pid=2087 剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory ...
- java梳理-序列化与反序列化
一背景: 之前笔记关于rpc框架介绍中,提到为了调用远程服务,需要再确定消息结构后考虑序列化与反序列化,序列化主要是把对象转换成二进制码便于网络传输,反序列化就是相反的,主要目的是生成对象便于后续处理 ...
- 获得硬盘的ID序列号(XE10.1+WIN8.1)
疯狂delphi DelphiXE公开课群:100162924.58593121 朱建强QQ:513187410 获得硬盘的ID序列号(XE10.1+WIN8.1) 相关资料: https://zhi ...
- 更改GeoServer的端口号
更改GeoServer的端口号,这一问题在不同的GeoServer版本上的解决办法不禁相同.本文记录GeoServer2.7.6(独立安装)版本更改其端口号的办法. GeoServer默认端口为808 ...
- jQuery之noConflict() 方法
jQuery 核心 - noConflict() 方法,运行这个函数将变量 $ 的控制权让渡给第一个实现它的那个库.这有助于确保jQuery不会与其他库的$对象发生冲突. noConflict() 方 ...
- DBCC--OPENTRAN
返回最早开始的但仍在运行的事务 数据库 'DB1' 的事务信息. 最早的活动事务: SPID (服务器进程 ID): 60 UID (用户 ID): -1 名称 : user_tra ...