• CF1445C. Division 质因数分解


    传送门:https://codeforces.com/contest/1445/problem/C

    题意:给出两个整数p,q,要求找到最大的x使得

    $p mod x =0$

    $x mod q eq 0$

    题解:

    要求的x实际上就是p除掉点什么东西使得x不再是q的倍数,也就x的因数中是不含有p的全部质因数了

    由于$p leq 10^{18}$,所以不能暴力分解p的质因数

    所以暴力分解q的质因数,若q的质因数k的次数为$t_q$,p中k的次数为$t_p$,则x中k的次数至多为$t_q-1$,若要如此,x应为$frac{p}{max(1,k^{t_p-t_q+1})}$

    维护最大值求解即可

    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    //LL gcd(LL a,LL b){
    //    return a%b?gcd(b,a%b):b;
    //}
    
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            LL p,q;
            scanf("%lld %lld",&p,&q);
            LL t=p;
            LL qt=q;
            LL pt=p;
            //map<LL,LL> qdiv,pdiv;
            //vector<LL> ans;
            //ans.clear();
            LL qdiv,pdiv;
            LL ans;
            ans=0x3f3f3f3f3f3f3f3f;
            //qdiv.clear();pdiv.clear();
            for(LL i=2;i*i<=qt;i++){
                if(qt%i==0){
                    qdiv=1;
                    while(qt%i==0){
                        qt/=i;
                        qdiv*=i;
                    }
                    pdiv=1;
                    while(pt%i==0){
                        pt/=i;
                        pdiv*=i;
                    }
                    ans=min(ans,max(1ll,    pdiv/(qdiv/i)   ) );
                    //printf("debug %lld
    ",ans);
                    //qdiv.push_back(i);
                }
            }
            LL i=qt;
            if(i>1){
                    qdiv=1;
                    while(qt%i==0){
                        qt/=i;
                        qdiv*=i;
                    }
                    pdiv=1;
                    while(pt%i==0){
                        pt/=i;
                        pdiv*=i;
                    }
                    ans=min(ans,max(1ll,    pdiv/(qdiv/i)   ) );
                    //printf("debug %lld
    ",ans);
                    //qdiv.push_back(i);
                }
            //if(qt>1)qdiv[qt]=qt;
    //        while(t%q==0){
    //            while(t%*it!=0)it++;
    //            t/=*it;
    //        }
    printf("%lld
    ",p/ans);
    //        if(p%q!=0){
    //            printf("%lld
    ",p);
    //        }else{
    //            LL ans=p;
    //            while(ans%q==0){
    //                ans=gcd(ans/q,q)*(ans/q);
    //            }
    //            printf("%lld
    ",ans);
    //            
    //        }
    //        LL ans=p;
    //        for(map<LL,LL>::iterator it=qdiv.begin();it!=qdiv.end();it++){
    //            ans=min(ans,it->second);
    //        }
            
        }
        return 0;
    }
  • 相关阅读:
    短信猫软件的实现(C#)<八>7bitPDU的解码
    短信猫软件的实现(C#)<七>短信猫(简化测试版)实现
    短信猫软件的实现(C#)<十一>软件实现(完结篇)
    我的EDA课程设计 Verilog HDL 自动售票机的实现
    Linux JNI(1)
    Notes
    Linux 线程属性
    Linux shared lib
    Linux 几个调试命令
    Java工具
  • 原文地址:https://www.cnblogs.com/isakovsky/p/13964249.html
Copyright © 2020-2023  润新知