链接:
https://codeforces.com/problemset/problem/1294/C
题意:
对于一个数字n,找到三个不相同且大于等于2的a,b,c,使a×b×c=n
解:
把两个乘数先合一,变成T×F=n
为了复杂度,现在2-sqrt(n)找因数T,然后对每一个T,得到对应的F,判断F是否有因数,然后比较三个数字看是否重复,输出结果
PS:我只找了F的第一个因数,因为假设
n=64,T=2,F=32,F的第一个因数2,重复了,但是不继续找,找下一个T=4,F=16,F的第一个因数2;2,4,8成立
n=315,T=3,F=105,F的第一个因数,3,重复,下一个T=5,F=63,第一个因数3;3,5,21成立
所以即使不想后找,F在有其他合适因数的时候,也会被其他T刷出来
我还担心是不是超时,还好没超QWQ
实际代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int ss(int a)
{
int sq=sqrt(a);
if(a<=1) return 0;
if(a==2||a==3) return 0;
for(int i=2;i<=sq;i++) if(a%i==0) return i;
return 0;
}
int main()
{
int n;
cin>>n;
for(int f=1;f<=n;f++)
{
int a;
cin>>a;
bool book=0;
int sq=sqrt(a);
for(int i=2;i<=sq;i++)
{
if(a%i==0)
{
int d=a/i;
int temp;
if((temp=ss(d))==0) continue;
else
{
int tt=d/temp;
if(temp!=tt&&temp!=i&&i!=tt)
{
cout<<"YES"<<endl;
cout<<temp<<" "<<i<<" "<<d/temp<<endl;
book=1;
break;
}
}
}
}
if(!book) cout<<"NO"<<endl;
}
}
限制:
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output