题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1002


思路 :

N有若干个质因子, N = a^b * c^d * e^f......

M也有若干个质因子, M = a^(b+k) * c(d+k1) * e^(f+k2)......

N能到达M的条件是它们的质因子必须完全相同

N每次可以乘上它的若干个质因子, 直到这个质因子的幂次等于M这个质因子的幂次

考虑这样一个事实, N乘上某个质因子的a次幂后, 新的N可以乘上该质因子的2a次幂

故对于每个质因子, N的次数每次平方, cnt++, 直到大于等于M这个质因子的次数, 取最大的cnt即可

要注意的是M的范围会爆long long 所以要开unsigned long long

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef unsigned long long LL; const int MAXN = 1e6+;
const int PRI_NUM = 2e6+; bool vis[PRI_NUM];
int prime[MAXN];
int factor_n[MAXN];
int factor_m[MAXN];
int prime_n[];
int prime_m[]; void Pre()
{
for(int i = ; i <= PRI_NUM; i++) {
if(vis[i] == ) {
for(int j = i+i; j <= PRI_NUM; j+=i) {
vis[j] = ;
}
}
}
int cnt = ;
for(int i = ; i <= PRI_NUM; i++) {
if(vis[i] == ) {
prime[cnt++] = i;
}
}
} void Init()
{
memset(prime_n, , sizeof(prime_n));
memset(prime_m, , sizeof(prime_m));
} int main()
{
Pre(); int t;
int n;
LL m; scanf("%d", &t);
while(t--) {
Init();
scanf("%d %I64u", &n, &m);
if(m == n) {
printf("0\n");
continue;
}
if(m % n || n <= ) {
printf("-1\n");
continue;
}
int cnt = ;
for(int i = ; i < MAXN; i++) {
if(n == ) break;
if(n % prime[i] == ) {
factor_n[cnt] = prime[i];
while(n % prime[i] == ) {
n /= prime[i];
prime_n[cnt]++;
}
cnt++;
}
}
if(n > ) {
factor_n[cnt] = n;
prime_n[cnt] = ;
cnt++;
}
for(int i = ; i < cnt; i++) {
while(m % factor_n[i] == ) {
m /= factor_n[i];
prime_m[i]++;
}
}
if(m > ) {
printf("-1\n");
continue;
}
int ans = ;
for(int i = ; i < cnt; i++) {
int k = ;
while(prime_n[i] < prime_m[i]) {
prime_n[i] <<= ;
k++;
}
if(k > ans) ans = k;
}
printf("%d\n", ans);
} return ;
}

另外看到一种很强的做法

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef unsigned long long ULL; ULL Gcd(ULL a, ULL b)
{
ULL r;
while(a % b) {
r = a % b;
a = b;
b = r;
}
return b;
} int main()
{
int t;
ULL n, m; scanf("%d", &t);
while(t--) {
scanf("%I64u %I64u", &n, &m);
int ans = ;
bool flag = ;
while(n != m) {
if(m % n) {
flag = ;
break;
}
ULL temp = Gcd(m / n, n);
if(temp == ) {
flag = ;
break;
}
n *= temp;
ans++;
}
if(flag == ) {
printf("%d\n", ans);
}
else printf("-1\n");
} return ;
}

HDU 5505 - BestCoder Round #60 - GT and numbers的更多相关文章

  1. HDU 5506 - BestCoder Round #60 - GT and set

    题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1003 题意 : 给N集 ...

  2. hdu 5667 BestCoder Round #80 矩阵快速幂

    Sequence  Accepts: 59  Submissions: 650  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536 ...

  3. hdu 5643 BestCoder Round #75

    King's Game  Accepts: 249  Submissions: 671  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6 ...

  4. hdu 5641 BestCoder Round #75

    King's Phone  Accepts: 310  Submissions: 2980  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  5. BestCoder Round #60/HDU 5505 暴力数学

    GT and numbers 问题描述 给出两个数NN和MM. NN每次可以乘上一个自己的因数变成新的NN. 求最初的NN到MM至少需要几步. 如果永远也到不了输出-1−1. 输入描述 第一行读入一个 ...

  6. HDU 5682/BestCoder Round #83 1003 zxa and leaf 二分+树

    zxa and leaf Problem Description zxa have an unrooted tree with n nodes, including (n−1) undirected ...

  7. HDU 5496 - BestCoder Round #58 - Beauty of Sequence

      题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=637&pid=1002 思路 : 考 ...

  8. BestCoder Round #60 题解链接

    题解  题目 1001 GT and sequence 注意先特判000的情况:如果读入的数据有000,那么去掉所有的000且最后答案和000取一个max. 剩下的正数显然全部乘起来比较优. 对于负数 ...

  9. BestCoder Round #60 1002

    Problem Description You are given two numbers NNN and MMM. Every step you can get a new NNN in the w ...

随机推荐

  1. 《AngularJS》--指令的相互调用

    转载自http://blog.csdn.net/zhoukun1008/article/details/51296692 人们喜欢AngularJS,因为他很有特色,其中他的指令和双向数据绑定很吸引着 ...

  2. static类

    静态类,用于类内部. 静态类,不需要创建父类对象,即可使用. 非静态类,需要先创建父类对象,才可使用. class A{ static class  B1{} class B2{} } = new A ...

  3. Android开发环境搭建简介

    Android的开发工具,可以使用Eclipse,Idea,Android Studio,其中Eclipse是开源中国大部分使用的IDE,Idea是号称最好用的开发工具,有很多用处,Android S ...

  4. SQL 关于有单引号数据更新的问题

    要把sql语句中包含有单引号的符号加入到数据库中的做法 )),''','123.com') 很简单就是加入id=''123''            0'0就可以写成'0''0'

  5. jquery的几种异步请求,ajax

    http://blog.csdn.net/a5489888/article/details/8523316

  6. 解决Cacti监控图像断断续续问题

    最近cacti的图像全都是断断续续.新加的设备,图像也是这样,查看cacti 的log发现大量下面类似的错误信息:04/12/2011 03:54:37 PM - SPINE: Poller[0] H ...

  7. GET方式,获取服务器文件

    package com.http.get; import java.io.FileOutputStream; import java.io.IOException; import java.io.In ...

  8. libusb简介

    概述 libusb是一个C库,它提供了通用的访问USB设备. 它的目的是供开发人员使用方便的生产与USB通信硬件的应用程序. 可移植的: 使用一个跨平台API,它提供了访问USB设备在Linux上,O ...

  9. CSS的力量

    CSS(Cascading Style Sheet)级联样式表,是一种美观网页设计的解决方案,也是W3C推荐的标准,他可以是我们的网页设计更灵活,更美观,使设计人员对内容的设计和样式的设计分离,使设计 ...

  10. xdebug使用说明

    常用配置 xdebug.var_display_max_children整数类型,默认值128.用于控制通过xdebug_var_dump(),var_dump()方法时显示数组中子数组的个数或对象中 ...