POJ 2429 GCD LCM Inverse ★(pollard-ρ DFS枚举)

题目链接:http://poj.org/problem?id=2429 题目大意:给定gcd(a,b)和lcm(a,b)(<2^63),求a和b,如果有多种情况,输出和最小的情况.   首先gcd(a,b) * lcm(a,b) = a*b,但是如果我们直接从a*b中分解因子的话,a*b是可能超过long long的,这样就不好处理了. 我们可以先把gcd(a,b)都分给a,b,因为他们的因子中都要有gcd(a,b).于是现在还剩下lcm(a,b)/gcd(a,b)了,于是我们先用pollard-rho给他分解因子. 那么还有一个问题,能随便分么?分出来的a,b虽然能保证a*b,但是能保证他们的gcd和lcm都是给定的么?不一定. 所以我们还需要注意分因数的过程中还要保证gcd和lcm的正确性. 但这个问题其实不难,因为a*b一定是不变的,所以我们只要保证gcd和lcm其中一个不变,另一个也就自然不变了.显然保证gcd比较简单. 我们知道lcm/gcd = p1^q1 * p2 ^q2 *……* pn^qn,其中p1,p2,……,pn是因子.我们只要保证某个数把某个pi全部取走,这样他们除了先前取走的gcd外再无公因数,则可保gcd正确.这样的话,2^63内的数所有不同的因子个数最多也就十几个,枚举无压力.  

#include 
#include 
#include 
using namespace std;//return a * b % m
unsigned long long mul_mod(unsigned long long a, unsigned long long b, unsigned long long m){//为了防止long long型a * b溢出,有时需要把乘法变加法//且因为暴力加法会超时要使用二分快速乘法模(模仿二分快速幂模……)unsigned long long res = 0, tmp = a % m;while(b){if (b & 1){res = res + tmp;res = (res >= m ? res - m : res);}b >>= 1;tmp <<= 1;tmp = (tmp >= m ? tmp - m : tmp);}return res;
}//return a ^ b % m
long long exp_mod(long long a, long long b, long long m){long long res = 1 % m, tmp = a % m;while(b){if (b & 1){//如果m在int范围内直接用下一式乘就可以,否则需要用下二式把乘法化加法,用快速乘法模//res = (res * t) % m;res = mul_mod(res, tmp, m);}//同上//t = t * t % m;tmp = mul_mod(tmp, tmp, m);b >>= 1;}return res;
}/*-------------Miller-Rabin 素数测试 部分(用到上面mul_mod和exp_mod   素数return true)--------------*/
bool Miller_Rabin(long long n){int a[5] = {2, 3, 7, 61, 24251};//一般Miller_Rabin素数测试是随机选择100个a,这样的错误率为0.25^100//但在OI&&ACM中,可以使用上面一组a,在这组底数下,10^16内唯一的强伪素数为46,856,248,255,981if (n == 2)return true;if (n == 1 || (n & 1) == 0)return false;long long b = n - 1;for (int i = 0; i < 5; i ++){if (a[i] >= n)break;while((b & 1) == 0)    b >>= 1;long long t = exp_mod(a[i], b, n);while(b != n - 1 && t != 1 && t != n - 1){t = mul_mod(t, t, n);b <<= 1;}if (t == n - 1 || (b & 1))continue;elsereturn false;}return true;
}
/*-------------Miller-Rabin 素数测试 部分--------------*//*-------------pollard-rho 大整数n因子分解 部分(用到mul_mod()和Miller-Rabin测试)--------------*/
long long factor[100];      //存n的素因子
long long nfactor, minfactor;long long gcd(long long a, long long b){return b ? gcd(b, a%b) : a;
}
void Factor(long long n);
void pollard_rho(long long n){if (n <= 1)return ;if (Miller_Rabin(n)){factor[nfactor ++] = n;if (n < minfactor)minfactor = n;return ;}long long x = 2 % n, y = x, k = 2, i = 1;long long d = 1;while(true){i ++;x = (mul_mod(x, x, n) + 1) % n;d = gcd((y - x + n) % n, n);if (d > 1 && d < n){pollard_rho(d);pollard_rho(n/d);return ;}if (y == x){Factor(n);return ;}if (i == k){y = x;k <<= 1;}}
}
void Factor(long long n){//有时候RP不好 or n太小(比如n==4就试不出来……)用下面的pollard_rho没弄出来,则暴力枚举特殊处理一下long long d = 2;while(n % d != 0 && d * d <= n)d ++;pollard_rho(d);pollard_rho(n/d);
}
/*-------------pollard-rho 大整数n因子分解 部分--------------*/vector  > vfac;
void find(long long n, long long &a, long long &b){long long sum = (1LL << 62);long long suma;for (int i = 0; i < (1 << vfac.size()); i ++){long long res = 1;for (size_t k = 0; k < vfac.size(); k ++){if (i & (1 << k)){for (int p = 0; p < vfac[k].second; p ++){res *= vfac[k].first;}}}long long remain = n / res;if (res + remain < sum){sum = res + remain;a = suma = res;b = remain;}if (res + remain == sum){if (res < suma){a = suma = res;b = remain;}}}return ;
}
int main(){long long g, l, n;while(cin >> g >> l){n = l / g;vfac.clear();nfactor = 0;pollard_rho(n);long long tmp = n;for(int i = 0; i < nfactor; i ++){int facnum = 0;while(tmp % factor[i] == 0){tmp /= factor[i];facnum ++;}vfac.push_back(make_pair(factor[i], facnum));}long long a, b;find(n, a, b);cout << a * g << " " << b * g << endl;}return 0;
}
 

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/01/20/4114201.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动端怎么让底部固定_移动端排名应该怎么做?两种匹配移动端实战排名干货分享!...

关于移动端优化的问题、最近一些兄弟一直在问我应该怎么做?毕竟现在是手机的时代、绝大部分情况下、PC显得有点鸡肋!在讲移动端排名之前、逆冬先来讲两个容易被大家搞错的问题(移动端)。1、我观察现在的移动端都是独立的http://m.xxx.com&#xff0c;是不是百度喜欢独立的移动…

asterisk1.8 Makefile分析 (1)

为了观查Makefile的输出&#xff0c;可以对Makefile做如下修改。 1. 将PRINT_DIR和NOISY_BUILD这两个变量置为yes。 2. 修改Makefile.rules&#xff0c;将ECHO_PREFIX和CMD_PREFIX的赋值都去掉。 3. 将以下关键目标的命令前符号都去掉。 makeopts.embed_rules $(MOD_SUBDIR…

python定时发送信息_python实现定时发送消息

#!/usr/bin/env python#-*- coding:utf-8 -*- Author : wujf Time:2018/8/21 15:59# 自动发送消息from threading import Timerfrom wxpy import *import requestsimport urllib2,re,urllib,requests#bot Bot(console_qr2,cache_pathbotoo.pk1) #把consol_qr2去掉&#xff0c;…

Linux绘图函数与驱动,Linux中与驱动相关的ioctl函数

一: ioctl函数的作用ioctl用于向设备发控制和配置命令 &#xff0c;有些命令也需要读写一些数据&#xff0c;但这些数据是不能用read/write读写的&#xff0c;称为Out-of-band数据。也就是说&#xff0c;read/write读写的数据是in-band数据&#xff0c;是I/O操作的主体&…

给管道注册事件,用于用户是否登录!

1.一个网站项目的自定义cs文件&#xff0c;如图&#xff1a; 2.CheckRight.cs中的代码如下&#xff1a; public class CheckRight : IHttpModule{ public void Dispose() { } public void Init(HttpApplication app) { app.AcquireRequestState new EventHandler(app_AcquireR…

css 商城 两列_【云控基础】HTML+CSS基础入门

课程大纲&#xff1a;第一部分&#xff1a;课程概述1、什么是HTML、CSS&#xff0c;能做什么&#xff1f;2、HTML、HTML5、H5的区别3、HTMLCSS全览4、HTML、CSS的学习路径和学习方法第二部分&#xff1a;HTMLCSS开发环境搭建1、谷歌浏览器的安装和简单使用2、Sublime Text 编辑…

asterisk1.8 Makefile分析 (2)

menuselect.makeopts分析 查找makefile&#xff0c;这个目录的依赖关系如下&#xff1a; menuselect.makeopts: menuselect/menuselect menuselect-tree makeopts build_tools/menuselect-deps $(GLOBAL_MAKEOPTS) $(USER_MAKEOPTS) 下面我们逐个分析: 1) menu…

linux定时scp脚本,linux expect 实现定时scp的任务

一&#xff0c;什么是expect?expect 是一种脚本语言&#xff0c;在做系统管理时&#xff0c;我们很多时候需要输入密码&#xff0c;例如&#xff1a;连接 ssh,连接ftp,那么如何能做到不输入密码吗&#xff1f;我们需要有一个工具&#xff0c;能代替我们实现与终端的交互&#…

搜索不包含关键词_亚马逊listing关键词优化

亚马逊是一个客户至上的平台&#xff0c;它将客户体验置于一切之上。根据亚马逊的说法&#xff0c;消费者找到产品的速度越快&#xff0c;他们的购物体验就会越好。因此&#xff0c;亚马逊的A9算法被设计用来寻找对客户购物体验有价值的相关listing。如果你想提高你的搜索排名&…

asterisk1.8启动信息分析(未完)

将main/asterisk.c的开启守护进程的那行代码修改一下&#xff0c;即可看到asterisk的启动打印信息。 if (daemon(1, 0) < 0) 改为 if (daemon(1, 1) < 0) 下面分析启动信息 init_manager() Unable to open AMI configuration manager.conf, or configuration is inva…

excel文件损坏修复绝招_高手都在用的PDF转换PPT、WORD、EXCEL工具

点击上方关注我&#xff0c;UUUhooo&#xff0c;你最好了……首先说标题提到转换是在格式间转换&#xff0c;而不是软件间转换&#xff0c;所以标题是为了大多数人认知方便而起的&#xff0c;PDF是一种文档格式&#xff0c;全程叫便携式文档格式&#xff0c;而打开它的软件叫PD…

cowboy源码分析

2013-01-21 by 谢鸿锋   原创文章&#xff0c;转载请注明&#xff1a;转载自Erlang云中漫步 目录 一、概述 二、ranch源码分析 三、cowboy源码分析 1、Request调度规则 2、http协议实现分析 3、http协议之chunked编码 4、http协议之long_polling 5、http协议之websocket 6、…

linux解压tz zip,TZ 文件扩展名: 它是什么以及如何打开它?

TZ 疑难解答常见的 TZ 打开问题Smith Micro StuffIt Deluxe 已删除尝试打开 TZ 文件时&#xff0c;您收到错误 “无法打开 TZ 文件类型”。 发生这种情况时&#xff0c;通常是由于 %%os%% 中缺少 Smith Micro StuffIt Deluxe。 操作系统不知道如何处理你的 TZ 文件&#xff0c;…

python table对象_(RPA学习):Python-docx 常用方法

原标题&#xff1a;(RPA学习)&#xff1a;Python-docx 常用方法**1.**引用库from docx import Document**2.**新建一个空 docxdocument Document()**3.**保存 docxdocument.save(‘c:/test2.docx’)**4.**打开指定的 docxdocument Document(‘c:/test.docx’)**5.**在末尾增加…

ubuntu13.10无法登陆

在启动时到了登录界面后&#xff0c;输入用户名和密码&#xff0c;系统黑一下屏又回到了登录界面&#xff0c;怎么也进不去&#xff1f; 这时&#xff0c;按CtrlAltF1可以进入普通用户shell&#xff0c;CtrlAltF2可以进入root用户shell&#xff0c;AltF7可以回到图形界面。 进…

无法定位程序输入点 except_软件测试中的功能测试点(三)

testkuaibao|软件测试自学公众号26.输入法半角全角检查再输入信息中&#xff0c;输入一个或连串空格&#xff0c;查看系统如何处理&#xff0c;如对于要求输入符点型数据的项中&#xff0c;输入全角的小数点(“。”或“.”&#xff0c;如4.5)&#xff1b;输入全角的空格等。 27…

ASP.NET站点跨子域名单点登陆(SSO)的实现

http://blog.csdn.net/jason_dct/article/details/8502075 ASP.NET站点跨子域名单点登陆&#xff08;SSO&#xff09;的实现 在MSDN的文档“配置跨应用程序的 Forms 身份验证&#xff08;http://msdn2.microsoft.com/zh-CN/library/eb0zx8fc.aspx&#xff09;” 中&#xff0c;…

linux实验三makefile,实验平台上Makefile详细的解释

作者&#xff1a;甘老师,华清远见嵌入式学院讲师。# CORTEX-A8 PERI DRIVER CODE# VERSION 2.0# ATHUOR www.linuxidc.com# MODIFY DATE#2013.03.28 Makefile/***(下面的解释将用这个的形式进行标注)写好的源文件,要编译成二进制文件.需要指定工具链的,这里指定我们的工具链是…

python esp8266模块_ESP8266使用笔记之常用固件

开发板使用的是NodeMCU开发板&#xff1a;目录1.学习使用ESP8266官方的SDK1.1使用SDK提供的AT固件1.2使用SDK Build固件2.学习使用NodeMCU固件(上层可使用Lua开发)和MicroPython固件(上层可使用MicroPython开发)学习使用ESP8266官方的SDK使用AT固件&#xff1a;下载开发包&…

基础C#总结

由于在学习c#这段视频是为了辅助设计模式的学习,这部分的内容也和VB的内容很大程度上是一样的.虽然在开始的 时候,有些困难.在接触了一些例子和实验后.理解起来变得顺畅了很多.下面是对c#基础内容的总结.很多内容都在VB中有 过接触,所以都是些基础知识.捋一捋,将这些时间脑子的…