• Codeforces 1294C


    题目大意:

    给定一个n,问是否存在3个互不相同的,大于等于2的整数,满足a*b*c=n

    解题思路:

    可以把abc其中任意两个看作一个整体,例如a*b=d,那么可以发现d*c=n

    所以d和c是n的因子

    易得a和b也是n的因子

    所以可以往n的因子这方面去考虑

    题目就变成,是否存在3个不互相同的且大于等于2的n的因子,使得这三个因子的乘积为n

    循环i=2~sqrt(n),找出所有n的因子i和对应的n/i,储存起来

    又可以想到,如果abc其中有任意一个数大于sqrt(n),那么剩下两个数的乘积必定小于sqrt(n)

    所以只需要枚举2~sqrt(n)中的因子,取出两个当作a和b,判断此时的c是否存在即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    vector<ll> fac;//存2~sqrt(n)内的因子
    set<ll> mfac;//存除了1和自身的所有的因子
    void solve(){
        fac.clear();
        mfac.clear();
        ll n,i,j,d,d2,cnt;
        cin>>n;
        d=sqrt(n);
        for(i=2;i<=d;i++)
            if(n%i==0){
                fac.push_back(i);
                mfac.insert(i);
                mfac.insert(n/i);
            }
        cnt=fac.size();
        for(i=0;i<cnt;i++)
            for(j=i+1;j<cnt;j++){
                d=fac[i]*fac[j];//枚举两个数乘积
                d2=n/d;
                if(n%d==0&&d2!=fac[i]&&d2!=fac[j]&&mfac.find(d2)!=mfac.end()){//如果乘积d是n的因子,且此时三个数互不相同,且n/d也是n的因子,说明找到了答案
                    cout<<"YES
    "<<fac[i]<<' '<<fac[j]<<' '<<n/d<<'
    ';
                    return;
                }
            }
        cout<<"NO
    ";
    }
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        int T;cin>>T;
        while(T--)
            solve();
        
        return 0;
    }

    另,还可以根据a,b,c都为n的因子这个定理,在找到第一个因子a后,把b,c看作是n/a的因子

    那么就可以只找两个因子就结束循环直接进行判断

    #include<bits/stdc++.h>
    using namespace std;
    void solve(){
        int n,i,cnt=0,d,ar[3];
        cin>>n;
        for(i=2;i*i<=n;i++)
            if(n%i==0){
                ar[cnt++]=i;
                n/=i;
                if(cnt==2)
                    break;
            }
        if(cnt==2){
            ar[2]=n;
            sort(ar,ar+3);
            if(ar[0]!=ar[1]&&ar[1]!=ar[2]){
                cout<<"YES
    "<<ar[0]<<' '<<ar[1]<<' '<<ar[2]<<'
    ';
                return;
            }
        }
        cout<<"NO
    ";
    }
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        int T;cin>>T;
        while(T--)
            solve();
        
        return 0;
    }
  • 相关阅读:
    BZOJ 2957: 楼房重建
    那些年犯下的逗比错误
    BZOJ 2165: 大楼
    BZOJ 2115: [Wc2011] Xor
    bzoj 2006 [NOI2010]超级钢琴——ST表+堆
    bzoj 4571 [Scoi2016]美味——主席树
    bzoj 1014 [JSOI2008]火星人prefix——splay+哈希
    bzoj 2962 序列操作——线段树(卷积?)
    CF 809D Hitchhiking in the Baltic States——splay+dp
    bzoj 3489 A simple rmq problem——主席树套线段树
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12230015.html
Copyright © 2020-2023  润新知