zoukankan      html  css  js  c++  java
  • POJ2429 SCU2106 GCD & LCM Inverse

    #include<stdio.h>
    #include<math.h>
    #define LL long long
    LL a, b, x, y;
    LL gcd(LL p, LL q) {
    LL r = 1;
    while (r) {
    r = p % q;
    if (r) {
    p = q;
    q = r;
    }
    }
    return q;
    }
    LL solve() {
    LL i, te;
    b /= a;
    te = (LL) (sqrt(b * 1.0));
    for (i = te; i >= 1; i--) {
    if (b % i == 0) {
    if (gcd(i, b / i) == 1) {
    return i;
    }
    }
    }
    return 0;
    }
    int main() {
    /*freopen("t.txt", "r", stdin);*/
    LL te;
    while (scanf("%lld %lld", &a, &b) != EOF) {
    te = solve();
    x = te * a, y = b / te * a;
    if (x > y) {
    te = x, x = y, y = te;
    }
    printf("%lld %lld\n", x, y);
    }
    return 0;
    }
    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    #define LL unsigned long long
    #define nmax 2005
    LL factor[nmax], num[nmax], minx, ans;
    int flen, nnum;
    LL modular_multi(LL a, LL b, LL c) {
    LL ret;
    ret = 0, a %= c;
    while (b) {
    if (b & 1) {
    ret += a;
    if (ret >= c) {
    ret -= c;
    }
    }
    a <<= 1;
    if (a >= c) {
    a -= c;
    }
    b >>= 1;
    }
    return ret;
    }
    LL modular_exp(LL a, LL b, LL c) {
    LL ret;
    ret = 1, a %= c;
    while (b) {
    if (b & 1) {
    ret = modular_multi(ret, a, c);
    }
    a = modular_multi(a, a, c);
    b >>= 1;
    }
    return ret;
    }
    int miller_rabin(LL n, int times) {
    if (n == 2) {
    return 1;
    }
    if ((n < 2) || (!(n & 1))) {
    return 0;
    }
    LL temp, a, x, y;
    int te, i, j;
    temp = n - 1;
    te = 0;
    while (!(temp & 1)) {
    temp >>= 1;
    te++;
    }
    srand(time(0));
    for (i = 0; i < times; i++) {
    a = rand() % (n - 1) + 1;
    x = modular_exp(a, temp, n);
    for (j = 0; j < te; j++) {
    y = modular_multi(x, x, n);
    if ((y == 1) && (x != 1) && (x != (n - 1))) {
    return 0;
    }
    x = y;
    }
    if (x != 1) {
    return 0;
    }
    }
    return 1;
    }
    LL gcd(LL a, LL b) {
    LL te;
    if (a < b) {
    te = a, a = b, b = te;
    }
    if (b == 0) {
    return a;
    }
    while (b) {
    te = a % b, a = b, b = te;
    }
    return a;
    }
    LL pollard_rho(LL n, int c) {
    LL x, y, d, i, k;
    srand(time(0));
    x = rand() % (n - 1) + 1;
    y = x;
    i = 1;
    k = 2;
    while (1) {
    i++;
    x = (modular_multi(x, x, n) + c) % n;
    d = gcd(y - x, n);
    if ((d > 1) && (d < n)) {
    return d;
    }
    if (y == x) {
    return n;
    }
    if (i == k) {
    y = x;
    k <<= 1;
    }
    }
    return -1;
    }
    void findFactor(LL n, int c) {
    if (n == 1) {
    return;
    }
    if (miller_rabin(n, 6)) {
    factor[++flen] = n;
    return;
    }
    LL p = n;
    while (p >= n) {
    p = pollard_rho(p, c--);
    }
    findFactor(p, c);
    findFactor(n / p, c);

    }
    int cmp(const void *a, const void *b) {
    LL te = (*(LL *) a - *(LL *) b);
    if (te > 0) {
    return 1;
    } else if (te < 0) {
    return -1;
    }
    return 0;
    }
    void solve() {
    qsort(factor, flen + 1, sizeof(factor[0]), cmp);
    num[0] = factor[0];
    nnum = 0;
    int i;
    for (i = 0; i < flen; i++) {
    if (factor[i] == factor[i + 1]) {
    num[nnum] *= factor[i + 1];
    } else {
    num[++nnum] = factor[i + 1];
    }
    }
    }
    void dfs(int s, LL sn, LL n) {
    if (s == nnum + 1) {
    if (minx == -1 || (sn + n / sn < minx)) {
    if (gcd(sn, n / sn) == 1) {
    minx = sn + n / sn;
    ans = sn;
    }
    }
    return;
    }
    dfs(s + 1, sn * num[s], n);
    dfs(s + 1, sn, n);
    }
    int main() {
    #ifndef ONLINE_JUDGE
    freopen("t.txt", "r", stdin);
    #endif
    LL a, b, n, x, y;
    while (scanf("%lld %lld", &a, &b) != EOF) {
    if (a == b) {
    printf("%lld %lld\n", a, b);
    continue;
    }
    n = b / a;
    if (miller_rabin(n, 10)) {
    printf("%lld %lld\n", a, b);
    continue;
    }
    flen = -1;
    findFactor(n, 207);
    solve();
    minx = -1LL;
    dfs(0, 1LL, n);
    x = ans;
    y = n / ans;
    if (x > y) {
    n = x, x = y, y = n;
    }
    printf("%lld %lld\n", x * a, y * a);
    }
    return 0;
    }



  • 相关阅读:
    python操作elasticsearch
    php源码的编译
    linux 访问windows 共享文件
    list容器排除重复单词的程序
    求组合数m_n
    简单堆排序
    快速排序
    判断点在直线左侧或者右侧
    求取点到直线的距离
    求给定三个点的夹角
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/2207692.html
Copyright © 2011-2022 走看看