BUPT2017 wintertraining(15) #8E

题意

长度为n(\(n<2^{63}\))的绳子,每隔长度L(1<L<n)做一次标记,标记值就是L,L是n的约数。

每轮标记都选一个L,且L之间两两互质。

求L的最多种数K。以及标记之和S的最大值。

题解

对n进行分解质因数,K就是不同质因子的个数,S就是p^{a_i}之和。不过题目要求L<n,所以当S算出来是n时,再除以一下最小的质因子。

分解比较小的n(<1e9),可以直接枚举,复杂度是\(O(\sqrt n)\)。但是这里n比较大,需要用更高效的算法。

官方标程的方法:

先用Miller Rabin素数测试判断n是否是素数,是则直接返回。否则用pollard_rho算法找出用一个因子p。再递归地分解p和n/p。

代码

#include <cstdio>
#include <ctime>
#include <algorithm>
using namespace std;
typedef long long ll;
const int Times=10;
ll gcd(ll a, ll b){
while(b){
ll t=a%b;
a=b;
b=t;
}
return a;
}
ll qmul(ll a, ll b, ll m){
ll ans=0;
while(b){
if(b&1){
ans=ans+a;
if(ans>=m)ans-=m;
}
a<<=1;
if(a>=m)a-=m;
b>>=1;
}
return ans;
}
ll qpow(ll a, ll b, ll m){
ll ans=1;
while(b){
if(b&1)
ans=qmul(ans,a,m);
a=qmul(a,a,m);
b>>=1;
}
return ans;
}
bool Miller_Rabin(ll n){
if(n==2)return true;
if(n<2||!(n&1))return false;
ll m=n-1,x,y,a;
int k=0;
while(!(m&1)){
++k;
m>>=1;
}
for(int i=0;i<Times;++i){
a=rand()%(n-1)+1;
x=qpow(a,m,n);
for(int j=0;j<k;++j){
y=qmul(x,x,n);
if(y==1&&x!=1&&x!=n-1)return false;
x=y;
}
if(y!=1)return false;
}
return true;
}
ll pollard_rho(ll n, ll c){
ll i=1, k=2, x, y;
x=y=rand()%(n-1)+1;
while(1){
++i;
x=(qmul(x, x, n)+c)%n;
ll d=gcd((y-x+n)%n, n);
if(d>1&&d!=n)return d;
if(y==x)return n;
if(i==k){
y=x;
k<<=1;
}
}
}
ll fac[200],cnt;
void find(ll n,int c){
if(n==1)return;
if(Miller_Rabin(n)){
fac[++cnt]=n;
return;
}
ll p=n;
ll k=c;
while(p>=n)p=pollard_rho(p,c--);
find(p,k);
find(n/p, k);
}
int main(){
int t;ll n;
scanf("%d", &t);
while(t--){
cnt=0;
scanf("%lld", &n);
find(n, 97);
sort(fac, fac+cnt+1);
int num=0;
ll sum=0,tmp=0;
for(int i=1;i<=cnt;++i){
if(fac[i]!=fac[i-1]){
++num;
sum+=tmp;
tmp=fac[i];
}else tmp*=fac[i];
}
if(num==1)sum=n/fac[1];
else sum+=tmp;
printf("%d %lld\n",num, sum);
}
return 0;
}

【HDU - 4344】Mark the Rope(大整数分解)的更多相关文章

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

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

  2. Miller&&Pollard HDOJ 4344 Mark the Rope

    题目传送门 题意:一个长为n(n<2^63)的管子,在管子上做标记,每隔L个长度单位做一个标记,从管子头端开始,保证最后一次标记恰好在管子的尾端.让你找出有多少个这样的L(L<n),且他们 ...

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

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

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

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

  5. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  6. [poj1811]Prime Test(Pollard-Rho大整数分解)

    问题描述:素性测试兼质因子分解 解题关键:pollard-rho质因数分解,在RSA的破译中也起到了很大的作用 期望复杂度:$O({n^{\frac{1}{4}}})$ #include<cst ...

  7. 大整数分解质因数(Pollard rho算法)

    #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> ...

  8. POJ2429 GCD & LCM Inverse pollard_rho大整数分解

    Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and t ...

  9. Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS

    进入a b 多少努力p, q 使p*q == a && p < q && p >= b 直接大整数分解 然后dfs所有可能的解决方案劫持 #include ...

随机推荐

  1. hdu3294(马拉车模板)

    注意:string会超时 #include<bits/stdc++.h> using namespace std; #define ll long long const double PI ...

  2. poj 1486 纸张与数字匹配(二分图+割边处理)

    题目来源:http://poj.org/problem?id=1486 题意: 算出所有独一无二的字母与数字的组合,使二分图完全匹配 我以为所有点都要独一无二匹配时输出匹配方法 题解: 先得到一个完全 ...

  3. C. Polycarp Restores Permutation

    链接 [https://codeforces.com/contest/1141/problem/C] 题意 qi=pi+1−pi.给你qi让你恢复pi 每个pi都不一样 分析 就是数学吧 a1 +(a ...

  4. OSS网页上传和断点续传(OSS配置篇)

    OSS网页上传和断点续传主要根据BrowserJS-SDK和相关文档整理而得,快速构建OSS上传应用 一.Bucket设置 浏览器中直接访问OSS需要开通Bucket的CORS设置 将allowed ...

  5. 在Git中添加一个项目

    首先保证Git服务器正确配置,管理员机器可正常连接并使用Git. 第一步:在服务器上新建一个项目仓库 切换到git用户: a@ubuntu:/home/git$ su - git $ cd /home ...

  6. nginx 编译安装以及简单配置

    前言 Nginx的大名如雷贯耳,资料太多了,网上一搜一大把,所以这里就不阐述nginx的工作原理了,只是简单的编译安装nginx,然后呢,简单配置一下下. 下载Nginx.安装 下载地址:http:/ ...

  7. bridge br0 docker 网络问题 Docker Container与Docker Host

    Docker学习笔记:Docker 网络配置 - docker ppt - docker中文社区http://www.docker.org.cn/dockerppt/111.html Bridge t ...

  8. MySQL经典编程问题

    星期数的问题 1 计算日期是周几 这个问题看似很简单,可以用MySQL内置函数来计算 (1) weekday(date)其返回值是0-6,0代表Monday, 6代表Sunday: (2) dayof ...

  9. 《Effective C++》资源管理:条款13-条款17

    条款13:以对象管理资源 为了防止资源泄漏,请使用RAII(Resource Acquisition Is Initialization)对象,在构造函数里面获得资源,在析构函数里面释放资源 auto ...

  10. jQuery EasyUI 折叠面板accordion的使用实例

    1.对折叠面板区域 div 设置 class=”easyui-accordion” 2.在区域添加多个 div, 每个 div 就是一个面板 (每个面板一定要设置 title 属性). 3.设置面板属 ...