题目链接 : 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. 工作的准备:atoi,itoa,strcpy,memcpy,strcmp,二分查找,strcat

    对常见的几个函数,周末没事写写,绝对是笔试面试中非频繁,前面n届学长无数次强调了,大家就别怀疑了.从今天开始,每天10道题. int atoi(const char* str) { if(str==N ...

  2. nginx 配置轮询服务

    通常我们应用nginx做代理时,用到它的轮训服务 #设置轮询名称 upstream zyy{ server 127.0.0.1:8080  #本机的apache服务 } server { listen ...

  3. oracle的concat的用法

    select concat( concat( concat( ( select area_name from ec_area where area_id ), ( select area_name f ...

  4. c#将Excel数据导入到数据库的实现代码(转载)

    假如Excel中的数据如下:     数据库建表如下:     其中Id为自增字段:      代码如下: using System; using System.Collections.Generic ...

  5. 关于ImageView加载出现OOM问题

    略感蛋疼,一直以为应该不是这个问题的,所以调试了一下午,后来测试了下如果在XML里面改变ImageView的src话会出现什么问题 结果如我预料,仍然是只能显示部分图片,因为之前有运行成功了,我也不清 ...

  6. java多线程心得

    多并发的时候,在什么情况下必须加锁?如果不加锁会产生什么样的后果. 加锁的场景跟java的new thread和Runnable的关系是什么? 看看java的concurrentMap源码. 还有sp ...

  7. (转)用eclipse创建一个j2ee的web工程后,左面projects窗口中的项目如何没有显示webRoot文件夹,除了src的文件夹,其他都不显示

    左边目录窗口的右上方,有个向下的箭头,点里面的filters,把所有的勾都去掉看看

  8. (转)C#静态构造函数

    静态构造函数是C#的一个新特性,在编程过程中用处并不广,它的主要目的是用于初始化一些静态的变量. 因为这个构造函数是属于类的,而不属于任何一个实例,所以这个构造函数只会被执行一次,而且是在创建此类的第 ...

  9. char * 和 void *

    POSIX.1 将 read函数的原型做了修改,经典的定义为 int read(int filedes, char *buf, unsigned nbytes); 修改为 ssize_t read(i ...

  10. 单点登录CAS使用记(四):为登录页面加上验证码

    CAS默认的登录页面样式如下,只有用户名与密码两项验证项目. 现在需要为首页登录加上验证码功能. 第一步:首页对默认登录页面的样式进行了调整,使其看上去还算美观. 在页面上加上了验证码项目. 第二步: ...