hdu5505 GT and numbers

来源:互联网 发布:淘宝卖家申请电子面单 编辑:程序博客网 时间:2024/04/30 22:17

看的大神的代码。。。


思路是,读入n,m,若m能整除n,求m / n与n的最大公约数(通过最大公约数这个因子n增长最快,用的次数最少),如果是1,说明和n互质,不可能完成。

如果最大公约数不是1,则n乘以这个最大公约数,开始迭代。


若刚开始m就不能整除n,则不可能完成。



#include <cstring>#include <cstdio>#include <cstdlib>#include <ctype.h>#include <iostream>#include <queue>#include <stack>#include <map>#include <algorithm>#include <math.h>#define ULL unsigned long longusing namespace std;ULL gcd(ULL a, ULL b) {    if (a % b) {        return gcd(b, a % b);    } else {        return b;    }}int main(){    int T, ans;    ULL m, n;    while (~scanf("%d", &T)) {        while (T--) {            ans = 0;            scanf("%I64u%I64u", &n, &m);            while (m != n) {                if (m % n) {                    puts("-1");                    break;                }                ULL k = gcd(m / n, n);                if (k == 1) {                    puts("-1");                    break;                }                n *= k;                ans++;            }            if (m == n) {                printf("%d\n", ans);            }        }    }    return 0;}


0 0