반응형

https://www.acmicpc.net/problem/11815

 

 

#문제 간단 정리

 

수학과 관찰이 필요한문제

 

#문제 해결 방법

 

우선 약수의개수가 홀수이려면 완전제곱수여야 한다 (어떤 수의 제곱이 되는 수 )

 

완전제곱수를 쉽게 확인하는 방법은

루트를 씌었다가 다시 제곱을해서 원래의 수가 되는지 확인 하는 것 

 

문제에서 X의 최대값이 10^18 이기 때문에 

뭐 대략 long double 사용하면 18자리정도 유효숫자를 표현할 수 있는데

 

10^18 에 루트를 씌우면 10^9 이기 때문에 충분히 표현 가능하다 

그래서 루트X가 정수인지는 판단에 문제가 없다

 

만약 이렇게 풀지 않는다면 이진탐색을 사용하면 되긴 할거다 

 

 

#전체 코드

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N; 
    cin >> N;

    while (N--) {
        long long X;
        cin >> X;


        long long r = (long long)floorl(sqrtl((long double)X));


        if (r * r == X) {
   
            cout << 1 << " ";
        }
        else {
            cout << 0 << " ";
        }
    }
    cout << "\n";
    return 0;
}
반응형

+ Recent posts