그냥 하는 노트와 메모장

BOJ 14559 - Protocol 본문

Solved problems

BOJ 14559 - Protocol

coloredrabbit 2020. 2. 26. 07:34

* BOJ 14559 - Protocol

[분류 - 수학, 다이나믹 프로그래밍]


  아이디어를 생각하기 어려운 문제..


  구하고자 하는 건 M세대를 거쳐 2^M개의 112345^k꼴로 표현되는 수의 합입니다. x+1 세대의 합을 x 세대로 표현이 가능해야 큰 수 M에 대응할 수 있습니다. 하지만 f(x), g(x)로 x+1을 나타낼 수가 없습니다. 즉, 다른 트릭을 쓰지 않고서는 범위를 줄일 수 없고, 점화식을 구할 수 없습니다.


  (페르마 소정리) 임의의 소수 p에 대해 임의의 양의 정수 x(x<p)에 대해 x의 곱셈 역원은 x^(p-2) mod m입니다. 따라서 112345도 곱셈의 역원이 분명 존재합니다. 이는 112345^(m-2)임을 알 수 있는데 여기서 112345^(m-1)=1 mod m임을 알 수 있습니다. 따라서 m-1의 임의의 약수 k에 대해 112345^k=1이 되는 가장 작은 k를 찾아봅시다. 이 값이 매우 크면 이 방법을 사용할 수 없습니다.

  실제로 112345라는 수에 대해서 가장 작은 k는 167임을 구할 수 있습니다.


  (행렬) 이제 167 x 167 행렬에서 x 세대에서 x+1 세대로 갈 때 승수에 대해서 167로

나눈 나머지로 축약시킬 수 있으므로 점화식을 구할 수 있습니다. 즉 (i, j)에 들어가야하는 값은 x세대 때 j였던 것의 개수가 x+1세대 때 i로 가는 경우의 수로 나타낼 수 있습니다. 간단하게 구하면 x세대 때 j는 f(j)와 g(j)로 두 개의 경우의 수로 나뉘기 때문에 각각 구해줍시다.

  167 x 1 행렬은 초기 0세대에 대한 값이고 167 x 1 행렬 X_M는 M세대 이후의 상태도라고 보시면 됩니다.


※ 벌레 캠프 머시기 알고리즘으로도 풀린다곤 하네요,, 전 모르겟네요~

'Solved problems' 카테고리의 다른 글

BOJ 3026 V  (0) 2020.05.18
BOJ 10564 - 팔굽혀펴기  (0) 2020.04.22
BOJ 13011 - 사탕의 밀도  (0) 2020.02.26
BOJ 13010 - h(n)  (0) 2020.02.25
CS Academy - Substring restrictions  (0) 2020.01.21
Comments