기록하는삶
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 15712번 _ 등비수열 본문
백준(Python)/수학(Mathematics)
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 15712번 _ 등비수열
mingchin 2022. 4. 10. 01:22728x90
반응형
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
반응형
'백준(Python) > 수학(Mathematics)' 카테고리의 다른 글
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 11402번 _ 이항 계수 4 (0) | 2022.04.14 |
---|---|
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 11401번 _ 이항 계수 3 (0) | 2022.04.12 |
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 7894번 _ 큰 수 (0) | 2022.04.08 |
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2487번 _ 섞기 수열 (0) | 2022.04.07 |
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 3955번 _ 캔디 분배 (0) | 2022.04.07 |