zoukankan      html  css  js  c++  java
  • POJ 2429 GCD & LCM Inverse

    设答案为ans1,ans2

    ans1=a1*gcd,ans2=a2*gcd,a1,a2互质

    gcd*a1*b1=lcm,gcd*a2*b2=lcm

    a1*b1=lcm=(ans1*ans2)/gcd=a1*a2

    综上所诉,a1=b2,a2=b1。

    也就是说,ans1=gcd*k1,ans2=gcd*k2

    要求k1,k2尽量接近,并且k1,k2互质,并且,k2*k2=lcm/gcd

    需要用到Pollard_rho分解质因数,然后暴力搜索寻找k1,k2。用了kuangbin大神的Pollard_rho模板。

    有一个坑:输入的gcd和lcm一样的话,直接输出gcd,lcm即可。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int S=20;
    
    long long mult_mod(long long a,long long b,long long c)
    {
        a%=c;
        b%=c;
        long long ret=0;
        while(b)
        {
            if(b&1){ret+=a;ret%=c;}
            a<<=1;
            if(a>=c)a%=c;
            b>>=1;
        }
        return ret;
    }
    
    long long pow_mod(long long x,long long n,long long mod)
    {
        if(n==1)return x%mod;
        x%=mod;
        long long tmp=x;
        long long ret=1;
        while(n)
        {
            if(n&1) ret=mult_mod(ret,tmp,mod);
            tmp=mult_mod(tmp,tmp,mod);
            n>>=1;
        }
        return ret;
    }
    
    bool check(long long a,long long n,long long x,long long t)
    {
        long long ret=pow_mod(a,x,n);
        long long last=ret;
        for(int i=1;i<=t;i++)
        {
            ret=mult_mod(ret,ret,n);
            if(ret==1&&last!=1&&last!=n-1) return true;
            last=ret;
        }
        if(ret!=1) return true;
        return false;
    }
    
    bool Miller_Rabin(long long n)
    {
        if(n<2)return false;
        if(n==2)return true;
        if((n&1)==0) return false;
        long long x=n-1;
        long long t=0;
        while((x&1)==0){x>>=1;t++;}
        for(int i=0;i<S;i++)
        {
            long long a=rand()%(n-1)+1;
            if(check(a,n,x,t))
                return false;
        }
        return true;
    }
    
    long long factor[100];
    int tol;
    
    long long gcd(long long a,long long b)
    {
        if(a==0)return 1;
        if(a<0) return gcd(-a,b);
        while(b)
        {
            long long t=a%b;
            a=b;
            b=t;
        }
        return a;
    }
    
    long long Pollard_rho(long long x,long long c)
    {
        long long i=1,k=2;
        long long x0=rand()%x;
        long long y=x0;
        while(1)
        {
            i++;
            x0=(mult_mod(x0,x0,x)+c)%x;
            long long d=gcd(y-x0,x);
            if(d!=1&&d!=x) return d;
            if(y==x0) return x;
            if(i==k){y=x0;k+=k;}
        }
    }
    
    void findfac(long long n)
    {
        if(Miller_Rabin(n))
        {
            factor[tol++]=n;
            return;
        }
        long long p=n;
        while(p>=n)p=Pollard_rho(p,rand()%(n-1)+1);
        findfac(p);
        findfac(n/p);
    }
    
    long long r[100];
    int num;
    long long k;
    
    void dfs(long long now,int x,long long n)
    {
        if(now>sqrt(n)) return;
        k=max(k,now);
        for(int i=x;i<=num;i++) dfs(now*r[i],i+1,n);
    }
    
    int main()
    {
        long long gcd,lcm,n;
        while(scanf("%lld%lld",&gcd,&lcm)!=EOF)
        {
            if(gcd==lcm)
            {
                printf("%lld %lld
    ",gcd,lcm);
                continue;
            }
            tol=0;
            n=lcm/gcd;
            findfac(n); sort(factor,factor+tol);
            num=0; for(int i=0;i<=50;i++) r[i]=1;
            r[num]=factor[0];
            for(int i=1;i<tol;i++)
            {
                if(factor[i]==factor[i-1]) r[num]=r[num]*factor[i];
                else
                {
                    num++;
                    r[num]=factor[i];
                }
            }
            k=1; dfs(1,0,n);
            printf("%lld %lld
    ",gcd*k,gcd*(n/k));
        }
        return 0;
    }
  • 相关阅读:
    redis客户端windows版中文乱码解决方案
    nginx做负载均衡,怎么在有宕机情况出现时保证网站的响应速度
    支付宝同步和异步验签结果不一致的解决方法
    @ResponseBody中文乱码解决方案
    [javamail]AUTH LOGIN failed;Invalid username or password报错
    Could not load driverClass ${driverClassName} 的解决方案
    eclipse中,maven报错maven.multiModuleProjectDirectory system property is not set
    spring bean初始化和销毁方法
    关于静态资源是否应该放到WEB-INF目录
    使用Jedis出现Connection refused的解决方案
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5369784.html
Copyright © 2011-2022 走看看