Codeforces Round #615 (Div. 3). C - Product of Three Numbers

题面:https://codeforces.com/contest/1294/problem/C

题目大意:

给定一个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是否存在即可

 1 /*
 2 Written By StelaYuri
 3 On 2020/01/22
 4 */
 5 #include<bits/stdc++.h>
 6 using namespace std;
 7 typedef long long ll;
 8 vector<ll> fac;//存2~sqrt(n)内的因子
 9 set<ll> mfac;//存除了1和自身的所有的因子
10 void solve(){
11     fac.clear();
12     mfac.clear();
13     ll n,i,j,d,d2,cnt;
14     cin>>n;
15     d=sqrt(n);
16     for(i=2;i<=d;i++)
17         if(n%i==0){
18             fac.push_back(i);
19             mfac.insert(i);
20             mfac.insert(n/i);
21         }
22     cnt=fac.size();
23     for(i=0;i<cnt;i++)
24         for(j=i+1;j<cnt;j++){
25             d=fac[i]*fac[j];//枚举两个数乘积
26             d2=n/d;
27             if(n%d==0&&d2!=fac[i]&&d2!=fac[j]&&mfac.find(d2)!=mfac.end()){//如果乘积d是n的因子,且此时三个数互不相同,且n/d也是n的因子,说明找到了答案
28                 cout<<"YES\n"<<fac[i]<<' '<<fac[j]<<' '<<n/d<<'\n';
29                 return;
30             }
31         }
32     cout<<"NO\n";
33 }
34 int main(){
35     ios::sync_with_stdio(0);
36     cin.tie(0);cout.tie(0);
37     int T;cin>>T;
38     while(T--)
39         solve();
40     
41     return 0;
42 }

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

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

 1 /*
 2 Written By StelaYuri
 3 On 2020/01/23
 4 */
 5 #include<bits/stdc++.h>
 6 using namespace std;
 7 void solve(){
 8     int n,i,cnt=0,d,ar[3];
 9     cin>>n;
10     for(i=2;i*i<=n;i++)
11         if(n%i==0){
12             ar[cnt++]=i;
13             n/=i;
14             if(cnt==2)
15                 break;
16         }
17     if(cnt==2){
18         ar[2]=n;
19         sort(ar,ar+3);
20         if(ar[0]!=ar[1]&&ar[1]!=ar[2]){
21             cout<<"YES\n"<<ar[0]<<' '<<ar[1]<<' '<<ar[2]<<'\n';
22             return;
23         }
24     }
25     cout<<"NO\n";
26 }
27 int main(){
28     ios::sync_with_stdio(0);
29     cin.tie(0);cout.tie(0);
30     int T;cin>>T;
31     while(T--)
32         solve();
33     
34     return 0;
35 }

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12230015.html