Files
CodeObject/storage/zeta/_static/20411.html
2026-04-27 09:44:16 +09:00

216 lines
8.2 KiB
HTML

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BOJ 20411 - Offline</title>
<style>
:root {
--bg: #fafaf8;
--paper: #ffffff;
--ink: #1e1f24;
--muted: #6a6d75;
--line: #d8dce3;
--accent: #0d6e6e;
--code-bg: #f4f6fb;
}
* { box-sizing: border-box; }
body {
margin: 0;
background:
radial-gradient(circle at 15% 0%, #f0efe9 0%, transparent 42%),
radial-gradient(circle at 85% 20%, #e7f1f2 0%, transparent 38%),
var(--bg);
color: var(--ink);
font-family: "Noto Sans KR", "Pretendard", "Apple SD Gothic Neo", sans-serif;
line-height: 1.65;
}
main {
max-width: 980px;
margin: 0 auto;
padding: 24px 16px 56px;
}
.header {
background: var(--paper);
border: 1px solid var(--line);
border-radius: 14px;
padding: 18px 20px;
margin-bottom: 18px;
}
.header h1 { margin: 0 0 6px; font-size: 1.5rem; }
.header p { margin: 0; color: var(--muted); font-size: 0.95rem; }
.header a { color: var(--accent); text-decoration: none; }
.section {
background: var(--paper);
border: 1px solid var(--line);
border-radius: 14px;
padding: 16px 18px;
margin-bottom: 14px;
overflow-x: auto;
}
h2 {
margin: 0 0 10px;
font-size: 1.05rem;
color: var(--accent);
border-bottom: 1px solid var(--line);
padding-bottom: 8px;
}
pre, code {
font-family: "JetBrains Mono", "Fira Code", monospace;
background: var(--code-bg);
}
pre {
padding: 12px;
border-radius: 10px;
border: 1px solid #e7ebf2;
overflow: auto;
}
blockquote {
margin: 14px 0;
padding: 16px 16px 14px 22px;
border-left: 4px solid var(--accent);
border-radius: 10px;
background: linear-gradient(90deg, #eef8f8 0%, #f9fdfd 100%);
color: #24313a;
font-weight: 600;
position: relative;
}
blockquote::before {
content: "“";
position: absolute;
left: 8px;
top: 2px;
font-size: 1.35rem;
line-height: 1;
color: #0b5f5f;
opacity: 0.7;
}
blockquote > :first-child { margin-top: 0; }
blockquote > :last-child { margin-bottom: 0; }
q {
color: #114f50;
font-weight: 700;
background: #edf8f8;
border-radius: 6px;
padding: 0 4px;
}
.math-inline math {
font-size: 1em;
vertical-align: middle;
}
.math-block {
margin: 10px 0;
padding: 8px 10px;
overflow-x: auto;
background: #f8fbff;
border: 1px solid #e2ecf8;
border-radius: 8px;
}
.math-block math {
font-size: 1.04em;
display: block;
}
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid var(--line); padding: 6px 8px; }
img { max-width: 100%; height: auto; }
</style>
</head>
<body>
<main>
<header class="header">
<h1>추첨상 사수 대작전! (Normal)</h1>
</header>
<article class="section">
<h2>문제</h2>
<p><u><strong>입력 제한 외 난이도에 따른 문제의 차이는 없다.</strong></u></p>
<p>APC는 매년 교내 참가자들에게 추첨상을 지급하고 있다. 올해 추첨상은 공정한 추첨을 위해 준표가 직접 작성한 난수생성기를 통해 추첨을 하고자 한다. <a href="https://ko.wikipedia.org/wiki/%EB%82%9C%EC%88%98%EB%B0%9C%EC%83%9D%EA%B8%B0" rel="nofollow">난수생성기</a>란, 이론적으로 예측을 더 할 수 없도록 일련의 숫자나 심볼을 생성하는 장치이다.</p>
<blockquote>
<p>주헌 : 형이 짠 난수생성기가 공정하다는 걸 어떻게 알아 ?</p>
<p>준표 : 걱정 마! c언어에서 ANSI 표준으로 사용하는 &#39;선형합동법(Linear Congruential)&#39; 을 구현할 거니까 ~</p>
<p>주헌 : 선형합동법이 뭔데 ?</p>
<p>준표 : 그게 뭐냐면 ..</p>
</blockquote>
<p>준표의 설명을 간단히 정리해보면,</p>
<p><strong>X<sub>1</sub> = (a &times; Seed + c) % m</strong></p>
<p><strong>X<sub>2</sub> = (a &times; X<sub>1</sub> + c) % m</strong></p>
<p>...</p>
<p><strong>X<sub>n + 1</sub> = (a &times; X<sub>n</sub> + c) % m</strong></p>
<p>이런 식으로 준표가 몰래 정하는 <em>a</em>, <em>c</em>, <em>m</em> 와 참가자들이 정하는 <em>Seed</em> 값을 바탕으로 위 공식에 따라 난수를 생성한다는 것이었다.</p>
<blockquote>
<p>주헌 : 음... <em>a</em>, <em>c</em>, <em>m</em>을 아무렇게나 잡으면 안 되지 않을까 ?</p>
<p>준표 : 응. Hull-Dobell 정리에 따르면 그게 맞아. 그런데 귀찮아서 그냥 <em>m을</em> 대충 내가 좋아하는 소수로 하려구.</p>
<p>주헌 : (형이 좋아하는 소수..? 씨익..)</p>
</blockquote>
<p>사실 주헌이는 올해에는 추첨상을 반드시 받아내겠다는 야망이 있었다! 위 대화는 그를 위한 초석이었던 것이다! 주헌이는 준표를 너무 잘 알기 때문에 준표가 좋아하는 소수를 이미 알고 있었고, 준표가 자신이 직접 작성한 난수생성기에 문제가 없음을 참가자들에게 알려주기 위해 실제 추첨 전 난수생성기가 잘 작동한다는 것을 모두의 앞에서 시연하기로 되어있었다.</p>
<p>주헌이는 계략을 짰다. 주헌이는 시연 중 참가자들이 정한 <em>Seed</em>와 이를 이용해 만들어진 <em>X<sub>1</sub></em>, <em>X<sub>2</sub></em> 를 이용해 준표가 몰래 정한 <em>a</em>, <em>c</em>를 찾아낼 것이다. 만약 주헌이가 추첨상을 받지 못한다면, 찾아낸 <em>a</em>, <em>c</em>를 폭로해 모든 것이 조작되었다고 주장하며 추첨 자체를 무효로 만들 계략이다! 주헌이는 <em>a</em>, <em>c</em>를 자동으로 찾아주는 프로그램을 만들고자 한다.</p>
</article>
<article class="section">
<h2>입력</h2>
<p>한 줄에 걸쳐 준표가 좋아하는 소수 <em>m</em>, 참가자들이 정한 Seed, 시연으로 공개된 <em>X<sub>1</sub></em>, <em>X<sub>2</sub></em> 이 주어진다. 항상 가능한 상황만 입력으로 주어진다.</p>
</article>
<article class="section">
<h2>출력</h2>
<p>준표가 비밀리에 선정한 정수 <em>a</em>, <em>c</em>를 출력한다. 가능한 답이 여러 개라면, 그중 아무거나 출력한다.</p>
</article>
<article class="section">
<h2>제한</h2>
<p><em>m</em> &le; 100,000 (<em>m</em>은 소수)</p>
<p>0 &lt; <em>Seed</em>, <em>X<sub>1</sub></em>, <em>X<sub>2</sub></em> &lt; <em>m</em></p>
<p>0&nbsp;&le;&nbsp;<em>a</em>, <em>c</em> &lt; <em>m</em></p>
</article>
<article class="section">
<h2>힌트</h2>
<p>c언어에서의 rand() 함수는 위와 비슷하지만 <em>X<sub>n</sub></em> 의 상위 16개 비트를 반환하도록 구현되어있다.</p>
</article>
<article class="section">
<h2>예제 입력 1 복사</h2>
<pre class="sampledata" id="sample-input-1">13 5 2 9
</pre>
</article>
<article class="section">
<h2>예제 입력 2 복사</h2>
<pre class="sampledata" id="sample-input-2">13 6 5 3
</pre>
</article>
<article class="section">
<h2>예제 입력 3 복사</h2>
<pre class="sampledata" id="sample-input-3">11 9 9 9
</pre>
</article>
<article class="section">
<h2>예제 출력 1 복사</h2>
<pre class="sampledata" id="sample-output-1">2 5
</pre>
</article>
<article class="section">
<h2>예제 출력 2 복사</h2>
<pre class="sampledata" id="sample-output-2">2 6
</pre>
</article>
<article class="section">
<h2>예제 출력 3 복사</h2>
<pre class="sampledata" id="sample-output-3">2 2
</pre>
</article>
</main>
</body>
</html>