일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 이진 탐색
- linear dependence
- matrix trnasformations
- matrix fo a linear transformation
- includepdf
- trivial solution
- 빅오메가
- 빅오 표기법
- python
- 재귀함수
- Big-Oh notation
- Big-Oh 예제
- 일차변환
- Big Omega
- Big Theta
- nontrivial solution
- homogeneous linear system
- recursive algorithms
- 페이지 겹칩
- 배열 섞기
- one-to-one
- 알고리즘 분석의 실례
- itertools
- 랜덤 순서 배열
- 코틀린 시작하기
- 빅세타
- Big-O 예제
- nonhomogeneous linear system
- 코틀린 Hello World!
- NumPy
- Today
- Total
코딩 연습
프로젝트 오일러 148번 본문
We can easily verify that none of the entries in the first seven rows of Pascal's triangle are divisible by 7:
1 | ||||||||||||
1 | 1 | |||||||||||
1 | 2 | 1 | ||||||||||
1 | 3 | 3 | 1 | |||||||||
1 | 4 | 6 | 4 | 1 | ||||||||
1 | 5 | 10 | 10 | 5 | 1 | |||||||
1 | 6 | 15 | 20 | 15 | 6 | 1 |
However, if we check the first one hundred rows, we will find that only 2361 of the 5050 entries are not divisible by 7.
Find the number of entries which are not divisible by 7 in the first one billion (109) rows of Pascal's triangle.
파스칼의 삼각형 처음 7 행까지의 수 중에는 7 로 나누어 떨어지는 수가 없다는 것을 위 그림에서 쉽게 확인할 수 있다.
하지만 처음 100 행까지 7로 나누어 떨어지지 않는 수는 전체 5050 개 중 2361 개가 있음을 알 수 있다.
그렇다면 처음 109 행까지의 수 중 7 로 나누어 떨어지지 않는 수들은 몇 개나 있을까?
처음에 이 문제를 보면서 파스칼의 삼각형의 제 n 행은 nCr (단, r=0,1,2,⋯,n) 로 이루어 진다는 사실을 이용하거나 혹은 조합의 성질 n−1Cr−1+n−1Cr=nCr 을 이용하여 풀 것이란 확신이 있었다. 그러나 그 확신은 점점 실망이 되었고, 좌절이 되었다.
그래서 일단 조합의 성질을 이용하여 무식하게 7 로 나눈 나머지들을 구해보기 시작했다. 여기서는 7 로 나눈 나머지가 0 인지 아닌지만 따지면 되기 때문에 7 로 나눈 나머지가 0 이 아닌 경우는 모두 1로 표시하여 파스칼의 삼각형을 다시 그려 나갔더니, 아주 놀라운 규칙성이 보이기 시작했다.
1) 제 7 행 까지의 규칙
파스칼의 삼각형의 제 n 행에는 n 개의 수들이 나열되고, 문제에서 보는 바와 같이 7 행까지는 7 로 나누어 떨어지는 수가 없으므로 7×82=28 개의 수가 모두 1 로 나타나게 된다.
2) 제 72 행 까지의 규칙
1)에서 본 7행까지의 삼각형을 S1 라고 한다면, 72 행까지는 다음과 같은 규칙성이 나타난다.
이때, S1 에서 7 로 나누어 떨어지지 않는 수가 28 개 이므로 72 행 까지는 총 28×28=282 개의 수가 7로 나누어 떨어지지 않는다.
3) 제 73 행 까지의 규칙
2) 에서 본 72 행 까지의 삼각형을 S2 라고 한다면, 73 행 까지는 다음과 같은 규칙성이 나타난다.
이때, S2 에서 7 로 나누어 떨어지지 않는 수가 282 개 이므로 73 행 까지는 총 282×28=283 개의 수가 7로 나누어 떨어지지 않는다.
⋮
n+1) 제 7n+1 행 까지의 규칙
제 7n 행 까지의 삼각형을 Sn 라고 한다면, 7n 행 까지는 다음과 같은 규칙성이 있다.
이때, Sn 에서 7 로 나누어 떨어지지 않는 수가 28n 개 이므로 7n+1 행 까지는 총 28n×28=28n+1 개의 수가 7 로 나누어 떨어지지 않는다.
자 이제 대충 규칙성이 보이는가? 이런 규칙성을 알고 있다면 문제를 풀기가 매우 수월해 진다. 정답을 구하기 위해서는 다음과 같은 과정을 거치면 된다.
1) 7n 이 109 을 넘지 않는 최대의 자연수 n 은 10 이다. 따라서 109 을 710으로 나누어 보면 몫이 3, 나머지가 152574253 이 된다. 따라서 S10 이 세 줄 나열되는 것이므로 2810 이 총 3×42=6 번 더해지면 된다.
∴sum=6×2810
2) 이제 1)에서의 나머지 152574253 을 79 으로 나누어 보면 몫이 3, 나머지가 31513423 이 된다. 여기서 조심해야 할 것이 1)에서 S10 이 세 줄만 등장했으므로 다음 줄은 네 개의 똑같은 삼각형으로 시작하게 된다는 것을 꼭 알아야 한다. 따라서 S9 네 개가 또 다시 세 줄 등장하게 된다. S9 가 세 줄이면 총 3×42×289 개의 수가 7 로 나누어 떨어지지 않을 것이고, 이것이 네 개 등장하므로 총 4×6×289 이 더해져야 한다.
∴sum=6×2810+4×6×289
3) 또다시 2)에서의 나머지 31513423 을 78 으로 나누어 보면 몫이 5, 나머지가 2689427 이 된다. 2)에서와 마찬가지로 S9 가 세 줄만 등장했으므로 다음 줄은 네 개의 똑같은 삼각형으로 시작하게 되고, 여기서는 S8 이 다섯 줄 등장하므로 총 4×4×5×62×288 이 sum 에 더해져야 한다.
∴sum=6×2810+4×6×289+4×4×15×288
4) 또다시 3)에서의 나머지 2689427 을 77 으로 나누어 보면 몫이 3, 나머지가 218798 이 된다. 3)에서 S8 이 다섯 줄만 등장했으므로 다음 줄은 여섯 개의 똑같은 삼각형으로 시작하게 되고, 여기서는 S7 이 세 줄 등장하므로 총 4×4×6×3×42×287 이 sum 에 더해지면 된다.
∴sum=6×2810+4×6×289+4×4×15×288+4×4×6×6×287
⋮
이 과정을 70 으로 나눈 몫과 나머지가 나올때까지 반복하면서 sum 을 더해나가면 답을 얻을 수 있다.
이해하기 힘들면 그림을 그려가면서 해 보는 것이 도움이 될 것이라 믿어 의심치 않는다.
'project euler with python' 카테고리의 다른 글
프로젝트 오일러 150번 (0) | 2016.03.15 |
---|---|
프로젝트 오일러 149번 (0) | 2016.03.15 |
프로젝트 오일러 147번 (0) | 2016.03.15 |
프로젝트 오일러 146번 (0) | 2016.03.15 |
프로젝트 오일러 145번 (0) | 2016.03.15 |