Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Mar 5, 2025

🧷 문제 링크

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

🧭 풀이 시간

42분

👀 체감 난이도

✏️ 문제 설명

  • 서로 다른 N개의 정수로 이루어진 집합이 있다.
  • 각 수는 최대 50자리이다.
  • 이 집합에서 가능한 모든 순열 중 하나를 무작위로 골라서, 순열의 원소를 모두 이어붙여 만든 수가 K로 나누어떨어질 확률을 구해보자.

🔍 풀이 방법

[사용한 알고리즘]

  • Bit DP

  • 어떤 수 A를 K로 나눈 나머지는 아래 과정을 반복해서 구할 수 있다.
  1. result = 0
  2. A의 각 자리에 있는 수 i마다, result = (result * 10 + i) % K
    => 나머지의 성질에 의해 가능하다.
    $(a + b) \mod K = ((a \mod K) + (b \mod K)) \mod K$
    $(a \times b) \mod K = ((a \mod K) \times (b \mod K)) \mod K$
  • 나머지 관리 방법을 알았으면, dp를 정의한다.
    dp[m][k] = 집합에서 고른 원소들 목록이 k일 때의 가능한 수 중, K로 나눈 나머지가 m인 경우의 수
  • 위 식을 bottom-up으로 채워 해결했다.

⏳ 회고

  • dp 전이할 때 각 수를 매번 직접 더해주니까 시간 초과가 난다.
  • $pre[k] = 10^k$로 정의해놓고 커팅해서 해결할 수 있었다.

@ShinHeeEul ShinHeeEul merged commit 9c1063b into main Mar 5, 2025
1 check passed
@oncsr oncsr added the success 👍 해설을 보지 않고 풀었을 때 label Mar 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants