HDU 5505 - BestCoder Round #60 - GT and numbers
题目链接 : 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的更多相关文章
- HDU 5506 - BestCoder Round #60 - GT and set
题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1003 题意 : 给N集 ...
- hdu 5667 BestCoder Round #80 矩阵快速幂
Sequence Accepts: 59 Submissions: 650 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- hdu 5643 BestCoder Round #75
King's Game Accepts: 249 Submissions: 671 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6 ...
- hdu 5641 BestCoder Round #75
King's Phone Accepts: 310 Submissions: 2980 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- BestCoder Round #60/HDU 5505 暴力数学
GT and numbers 问题描述 给出两个数NN和MM. NN每次可以乘上一个自己的因数变成新的NN. 求最初的NN到MM至少需要几步. 如果永远也到不了输出-1−1. 输入描述 第一行读入一个 ...
- 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 ...
- HDU 5496 - BestCoder Round #58 - Beauty of Sequence
题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=637&pid=1002 思路 : 考 ...
- BestCoder Round #60 题解链接
题解 题目 1001 GT and sequence 注意先特判000的情况:如果读入的数据有000,那么去掉所有的000且最后答案和000取一个max. 剩下的正数显然全部乘起来比较优. 对于负数 ...
- 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 ...
随机推荐
- 《AngularJS》--指令的相互调用
转载自http://blog.csdn.net/zhoukun1008/article/details/51296692 人们喜欢AngularJS,因为他很有特色,其中他的指令和双向数据绑定很吸引着 ...
- static类
静态类,用于类内部. 静态类,不需要创建父类对象,即可使用. 非静态类,需要先创建父类对象,才可使用. class A{ static class B1{} class B2{} } = new A ...
- Android开发环境搭建简介
Android的开发工具,可以使用Eclipse,Idea,Android Studio,其中Eclipse是开源中国大部分使用的IDE,Idea是号称最好用的开发工具,有很多用处,Android S ...
- SQL 关于有单引号数据更新的问题
要把sql语句中包含有单引号的符号加入到数据库中的做法 )),''','123.com') 很简单就是加入id=''123'' 0'0就可以写成'0''0'
- jquery的几种异步请求,ajax
http://blog.csdn.net/a5489888/article/details/8523316
- 解决Cacti监控图像断断续续问题
最近cacti的图像全都是断断续续.新加的设备,图像也是这样,查看cacti 的log发现大量下面类似的错误信息:04/12/2011 03:54:37 PM - SPINE: Poller[0] H ...
- GET方式,获取服务器文件
package com.http.get; import java.io.FileOutputStream; import java.io.IOException; import java.io.In ...
- libusb简介
概述 libusb是一个C库,它提供了通用的访问USB设备. 它的目的是供开发人员使用方便的生产与USB通信硬件的应用程序. 可移植的: 使用一个跨平台API,它提供了访问USB设备在Linux上,O ...
- CSS的力量
CSS(Cascading Style Sheet)级联样式表,是一种美观网页设计的解决方案,也是W3C推荐的标准,他可以是我们的网页设计更灵活,更美观,使设计人员对内容的设计和样式的设计分离,使设计 ...
- xdebug使用说明
常用配置 xdebug.var_display_max_children整数类型,默认值128.用于控制通过xdebug_var_dump(),var_dump()方法时显示数组中子数组的个数或对象中 ...