We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1016๋ฒˆ: ์ œ๊ณฑใ„ดใ„ด์ˆ˜ - ํŒŒ์ด์ฌ

Redddy 2022. 8. 27. 23:18

๐Ÿ”ˆ ๋ฌธ์ œ

์–ด๋–ค ์ •์ˆ˜ X๊ฐ€ 1๋ณด๋‹ค ํฐ ์ œ๊ณฑ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๋•Œ, ๊ทธ ์ˆ˜๋ฅผ ์ œ๊ณฑใ„ดใ„ด์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. ์ œ๊ณฑ์ˆ˜๋Š” ์ •์ˆ˜์˜ ์ œ๊ณฑ์ด๋‹ค. min๊ณผ max๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, min๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , max๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ œ๊ณฑใ„ดใ„ด์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ min๊ณผ max๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

๐Ÿ“‘์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— min๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , max๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ œ๊ณฑใ„ดใ„ด์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

โ—โ—์ œํ•œ

- 1 ≤ min ≤ 1,000,000,000,000
- min ≤ max ≤ min + 1,000,000

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

์ œ๊ณฑใ„ดใ„ด์ˆ˜๋Š” ์ œ๊ณฑ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ์ˆ˜, ์˜ˆ๋ฅผ ๋“ค์–ด 1,2,3,5,6,7,10์„ ์˜๋ฏธํ•œ๋‹ค. 4์™€ 8์€ 2์˜ ์ œ๊ณฑ์ˆ˜ 4๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ œ์™ธ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฒ˜์Œ์—๋Š” ํ›„๋ณด ์ˆซ์ž ๋ฒ”์œ„ ๋ฆฌ์ŠคํŠธ(n <= i <= m, ์ด๋•Œ n=min, m=max)๋ฅผ ๋งŒ๋“ค๊ณ  ์ œ๊ณฑ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ•˜์˜€๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

 

๊ทธ๋ž˜์„œ ๋ฐฉ๋ฒ•์„ ๋ฐ”๊พธ์–ด ํ›„๋ณด ์ˆซ์ž ๋ฒ”์œ„ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋กœ ์ˆซ์ž๋ฅผ ๋„ฃ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ทธ ์ˆ˜๊ฐ€ ์ œ๊ณฑใ„ดใ„ด์ˆ˜์ธ์ง€ ํ™•์ธํ•˜์˜€๋‹ค.

์ฆ‰ ์ดˆ๊ธฐํ™”๋ฅผ arr = [1]*(m-n+1) ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๊ณ  ๋ฐฉ๋ฌธํ•˜๋ฉด 0์œผ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” sum(arr)๋กœ 1์˜ ๊ฐ’์„ ์ธก์ •ํ•œ๋‹ค. 

 

์ œ๊ณฑ๊ทผ ๋ฆฌ์ŠคํŠธ๋Š” 2๋ถ€ํ„ฐ m์˜ ์ œ๊ณฑ๊ทผ ๊นŒ์ง€์ด๋‹ค. 

ํ•˜๋‚˜์”ฉ ์ œ๊ณฑํ•ด์ค€๋‹ค์Œ ๋ฐฐ์ˆ˜๊ฐ€ n๊ณผ m๋ฒ”์œ„ ์•ˆ์— ์žˆ๋‹ค๋ฉด arr ๋ฐฐ์—ด์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.

 

 

๐Ÿ’ป ์ฝ”๋“œ_1

n,m = map(int,input().split()) # min, max

sqrt_nums = [i**2 for i in range(2, int(m**0.5)+1)] # ์ œ๊ณฑ๊ทผ ๋ฆฌ์ŠคํŠธ
arr = [1]*(m-n+1) # ์ œ๊ณฑใ„ดใ„ด์ˆ˜ ํ™•์ธ ๋ฐฐ์—ด

for i in sqrt_nums:
    tmp = (n//i)*i 
    # ๋ฒ”์œ„ ์•ˆ๊นŒ์ง€
    while tmp<=m:
    	# ๋ฒ”์œ„ ์•ˆ์ด๋ผ๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”
        if n <= tmp and tmp <= m:
            arr[tmp-n] = 0
        tmp += i # ๋ฐฐ์ˆ˜
print(sum(arr))

์ฒซ๋ฒˆ์งธ ์ •๋‹ต ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ๋‚˜์™”๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ์˜ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด๋ณด๋‹ˆ ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ์กฐ๊ธˆ ๋งŽ์ด ๋‚˜์˜ค๋Š”๊ฒƒ ๊ฐ™์•„์„œ ์ œ๊ณฑ๊ทผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋ณด์•˜๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ_2

n,m = map(int,input().split())

arr = [1]*(m-n+1)
sqr = 2
while sqr <= int(m**0.5):
    i = sqr**2
    tmp = (n//i)*i
    while tmp<=m:
        if n <= tmp and tmp <= m:
            arr[tmp-n] = 0
        tmp += i
    sqr += 1
print(sum(arr))

์ด๋ ‡๊ฒŒ ํ•˜์˜€๋”๋‹ˆ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ์ค„์—ˆ์ง€๋งŒ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋Š˜์–ด๋‚ฌ๋‹ค. ๋Š˜์–ด๋‚œ ์ด์œ ๋Š” ์ฒซ๋ฒˆ์งธ while ๋ฌธ์— ํ™•์ธ ์—ฐ์‚ฐ์ธ sqr <= int(m**0.5) ์—์„œ ๋งค๋ฒˆ m**0.5 ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค์Œ ์—ฌ๋Ÿฌ๋ฒˆ ์—ฐ์‚ฐํ•˜์ง€ ์•Š๊ฒŒ ํ•˜์˜€๋”๋‹ˆ ์‹œ๊ฐ„์ด ๋งŽ์ด ์ค„์—ˆ๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ_3

n,m = map(int,input().split())
last = int(m**0.5)
arr = [1]*(m-n+1)
sqr = 2
while sqr <= last:
    i = sqr**2
    tmp = (n//i)*i
    while tmp<=m:
        if n <= tmp and tmp <= m:
            arr[tmp-n] = 0
        tmp += i
    sqr += 1
print(sum(arr))

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

์ธ๊ฐ„์Šน๋ฆฌ

 

๐Ÿ”— ๋ฌธ์ œ๋งํฌ ์ œ๊ณฑ ใ„ดใ„ด ์ˆ˜

 

1016๋ฒˆ: ์ œ๊ณฑ ใ„ดใ„ด ์ˆ˜

์–ด๋–ค ์ •์ˆ˜ X๊ฐ€ 1๋ณด๋‹ค ํฐ ์ œ๊ณฑ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š์„ ๋•Œ, ๊ทธ ์ˆ˜๋ฅผ ์ œ๊ณฑใ„ดใ„ด์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. ์ œ๊ณฑ์ˆ˜๋Š” ์ •์ˆ˜์˜ ์ œ๊ณฑ์ด๋‹ค. min๊ณผ max๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, min๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , max๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ œ๊ณฑใ„ดใ„ด์ˆ˜

www.acmicpc.net