1. 문제
11815번: 짝수? 홀수?
B를 A로 나누었을 때 나머지가 0 이라면 A는 B의 약수라고 할 수 있다. (A > 0, B > 0) 예를 들면 15 의 약수는 1, 3, 5, 15 이다. 주어진 수가 가지는 약수 개수가 홀수인지 짝수인지 판별해보자.
www.acmicpc.net
2. 풀이
소인수분해 해서 (지수+1)의 곱의 합으로 짝수인지 홀수인지 판단해볼라했는데 수가 10의 18제곱까지 있어서 그런지
시간초과
from sys import stdin
n = int(stdin.readline())
num_list = list(map(int,stdin.readline().split()))
for i in num_list:
p = 2
answer = 1
count = 0
while p*p <= i:
while i % p == 0:
i = i//p
count += 1
p += 1
answer *= (count+1)
count = 0
if i > 1:
answer *= 2
if answer % 2 == 0:
print(0,end = ' ')
else:
print(1, end = ' ')
정수론에서 제곱수의 약수의 개수는 홀수개이고, 그렇지 않은 수는 짝수개라는 사실이 있다
파이썬에서 제곱수를 판단하는 방법이 지금까지
int(i**(1/2)) 와 i**(1/2)가 같으면 되는걸로 알고 있었는데 틀렸다고 나오더라고
from sys import stdin
n = int(stdin.readline())
num_list = list(map(int,stdin.readline().split()))
for i in num_list:
if int(i**(1/2)) == i**(1/2):
print(1,end=' ')
else:
print(0,end=' ')
999999999999999999 이게 문제가 되더라
실제로 (1/2)제곱을 해보니까

1000000000를 제곱한다고 999999999999999999 나오는건아니잖아
실수오차 때문에 너무 큰 수에 대해 제곱근을 구하면 이런 문제가 생기더라
그래서... 제곱근을 판단할때 (1/2)제곱을 하고 나서 다시 제곱했을때 원래 수와 같은지를 판단하자
from sys import stdin
n = int(stdin.readline())
num_list = list(map(int,stdin.readline().split()))
answer = []
for i in num_list:
if (int(i**(1/2))**2 == i):
print(1,end=' ')
else:
print(0,end=' ')
728x90
'정수론' 카테고리의 다른 글
어떤 수를 서로소 쌍의 곱으로 빠르게 분해하는 방법 (0) | 2023.03.08 |
---|---|
두 수의 최대공약수와 두 수의 합은 무슨 관계가 있을까 (0) | 2023.03.08 |
등차수열 구간의 최대공약수를 한번에 구하는 방법 (0) | 2023.02.27 |
골드바흐의 추측을 알고리즘 문제에 적용하는 방법 (0) | 2023.02.06 |
팩토리얼(factorial)의 비밀 - 스털링 근사 공식과 자리수 계산하기 (0) | 2023.01.02 |