기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 15712번 _ 등비수열 본문

백준(Python)/수학(Mathematics)

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 15712번 _ 등비수열

mingchin 2022. 4. 10. 01:22
728x90
반응형

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

 

15712번: 등비수열

첫째 줄에 a, r, n, mod가 공백으로 구분되어 주어진다. a, r, n, mod는 모두 1보다 크거나 같고, 109보다 작거나 같은 자연수이다. 

www.acmicpc.net

[문제]

첫 항이 a, 공비가 r, 항의 수가 n인 등비수열의 합을 mod로 나눈 나머지를 구하시오.

 

[입력]

첫째 줄에 a, r, n, mod가 공백으로 구분되어 주어진다. a, r, n, mod는 모두 1보다 크거나 같고, 109보다 작거나 같은 자연수이다. 

[출력]

문제의 정답을 출력하라.

 

[아이디어]

1) 등비수열의 합 공식을 활용하기는 어렵다.

2) 각 항의 합을 구하되, 항의 개수가 짝수일 때와 홀수일 때를 나누어 절반씩의 합을 분할 정복한다.

 

a, r, n, mod=map(int,input().split())
def f(r,n,mod):
    if n==1:
        return 1
    elif n%2==0:
        return (f(r,n//2,mod))*(pow(r,n//2,mod)+1)%mod
    else:
        return (f(r,n-1,mod)+pow(r,n-1,mod))%mod       
print(a*f(r,n,mod)%mod)

꽤 짧아서 조금 수정해 숏코딩으로도 만들어봤다.

def f(a,r,n,x):
    if n==1:return a%x
    elif n%2==0:return(f(a,r,n//2,x))*(pow(r,n//2,x)+1)%x
    else:return(f(a,r,n-1,x)+a*pow(r,n-1,x))%x       
print(f(*map(int,input().split())))
728x90
반응형