백준 1037번 문제 - 약수


문제 링크 : https://www.acmicpc.net/problem/1037

N의 약수들은 제곱으로 N이 되는 약수를 제외하고 대칭이 되는 숫자들끼리 곱하여 N을 구할 수 있다.

예를 들어, 16의 경우 약수들은 {1, 2, 4, 8, 16}으로 16을 구하기 위해 1과 16, 2와 8, 4(제곱)을 선택하여야 한다.

N의 약수들이 주어졌을 때, N은 최소값과 최대값을 저장하여 곱함으로서 구할 수 있고 이는 다른 최대, 최소 값을 제외하고 저장할 필요가 없다는 것을 의미한다.

그러나 주어지는 약수들은 1,000,000이하의 정수로 입력되는 점을 고려하였을 때, 두 정수의 곱으로 표현되는 정수 N은 16비트로 표현되는 int형 정수가 아닌 32비트 정수로 표현하여야 한다.

32비트 정수를 표현하기 위해 최소 약수와 최대 약수의 곱은 long long int형 정수로 형변환을 하여 출력되도록 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
using namespace std;
int aliqot, N, alimin=1000000,alimax=1;

int main(){
scanf("%d",&N);
while(N--){
scanf("%d",&aliqot);
alimin = (aliqot<alimin)?aliqot:alimin;
alimax = (aliqot>alimax)?aliqot:alimax;
}
printf("%lld",(long long int)alimin*alimax);
return 0;
}

댓글