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. 001-电脑操作规范-2019年03月.doc

    001-电脑操作规范-2019年03月.doc   本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941   /////////////////////////////////////// ...

  2. Python学习第六篇——字典中的键和值

    favorite_language ={ "jen":"python", "sarah":"c", "edwa ...

  3. JVM的常用的调优策略和垃圾回收算法及Tomcat的常用调优参数

    jvm调优主要针对堆内存,堆内存分为:新生区.养老区和永久区 永久区存放的是系统jdk自身的interface和class的元数据,所以唯有新生区和养老区具有优化空间. 新生区:伊甸区和幸存者区.所有 ...

  4. 斐波那契数列yield表示

    def fib(num): n=0 a,b=0,1 while n<num: print(b) yield a,b=b,a+b n=n+1a=fib(30)next(a)next(a)  

  5. Notepad++远程连接Linux系统

    首先在官网下载 https://notepad-plus-plus.org/news/notepad-7.6.4-released.html 在命令行数输入ifconfig 查看自己的Linux的ip ...

  6. Spring中RedirectAttributes的用法

    RedirectAttributes 是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的的工具类.他有两种带参的方式: 第一种: redirectAttribut ...

  7. php分割中文字符串为数组的简单例子

    近日在做东西时,遇到要把中文字符进行逐字分割,试了很多方法,都不行,后来发现了一个超简单的方法: 分割字符串很简单,主要是用到函数preg_match_all.当处理含有中文的字符串时,可以用如下的方 ...

  8. Object.defineProperties()与Proxy对象代理

    Object.defineProperties() 了不起啊..vue.js通过它实现双向绑定的 Object.defineProperties(obj,props) 方法直接在一个对象上定义新的属性 ...

  9. gitlab+jenkins

    一.安装好gitlab.jenkins yum install -y java wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-sta ...

  10. Vue渲染函数

    前面的话 Vue 推荐在绝大多数情况下使用 template 来创建HTML.然而在一些场景中,真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更 ...