이 문제를 풀면 접근이 쉬워진다. $dp[S][c]$를 집합 $S$와 그 부분집합들을 모두 색칠하되, $S$를 $c$로 색칠할 경우 최소 비용이라고 정의하자. $S$를 빨간색으로 칠한다면, [$S$의 부분집합 중 파란색으로 칠해진 가장 큰 집합 $V$]은 유일하게 결정된다. (존재하지 않는 경우 포함) 이제 $V$에 존재하지 않는 원소를 갖는 $S$의 부분집합은 전부 빨간색으로 칠해지게 된다. 이를 이용하여, $\mathcal{O}(3^n)$ 동적계획법을 설계할 수 있다. 이를 최적화하려면, SOS DP를 활용하면 된다.
그런디 넘버를 계산하면, 결국 $(a_1 \pmod {x+1}) \oplus (a_2 \pmod{x+1}) \cdots \oplus (a_n \pmod{x+1})$를 계산하는 문제가 된다.
$1, 2, \cdots , n$ 중 홀수번 등장하는 집합을 $S$라고 정의하자. $t(x+1) \le v < (t+1)(x+1)-1$인 $v \in S$에 대하여 $(v-t(x+1))$의 XOR 값을 로그 시간에 계산할 수 있으면, $\mathcal{O}(n \log^2 n)$에 문제를 해결할 수 있다. 이를 위해서, $\displaystyle f(i, 2^k) = \oplus_{i \le x < i+2^k, x \in S} (x-i)$라고 정의하자.
이 함수는 Sparse Table과 비슷한 방식으로 계산될 수 있고, 우리가 원하는 값들 역시 이를 이용하여 로그 시간에 계산할 수 있다.
계산하는 과정이 굉장히 절묘하다. XOR의 성질과 Sparse Table의 성질이 절묘하게 잘 맞아떨어지는 것 같다.
각 $k$에 대해서 $c_k$를 구하는 문제를 풀자. 이제 index가 $k$의 배수인 값들만 보면 된다.
이제 $\text{gcd}(i, j)=1$, $1 \le i, j \le \lfloor \frac{n}{k} \rfloor$인 경우 $|a_{ik}-b_{jk}|$의 최댓값을 보면 될 것이다.
그러니 $c_1$을 빠르게 구하는 방법을 고안하면, 이를 이용하여 $c_1, c_2, \cdots c_n$을 전부 구할 수 있다. $c_1$을 구하자.
답에 대한 이분탐색을 하자. $|a_i-b_j| \ge C$인 $\operatorname{gcd}(i, j)=1$이 존재함을 판별하면 된다.
이를 위해서는 $X = \displaystyle \sum_{1 \le i, j \le n, |a_i-b_j| \ge C} \sum_{d|\operatorname{gcd}(i,j)} \mu(d) > 0$임을 판별하면 된다. 이는 $\sum_{d|n} \mu(d) = [n=1]$을 이용한 것이다.
$i$를 고정하고, $a_i$가 $X$에 추가하는 값을 구하자. 그러면 $\sum_{d|i} \mu(d) \cdot \left( \sum_{j=1}^n [|a_i-b_j| \ge C] \cdot [d|j] \right)$가 $X$에 추가가 된다.
핵심 아이디어는 "처음으로 1번 그룹이 꽉차는 시점", "처음으로 2번 그룹이 꽉차는 시점"으로 경우를 나누는 것이다.
이걸 하면 간단한 조합론적 카운팅으로 식을 세울 수 있다. 문제는 이를 빠르게 계산하는 것이다.
식을 잘 세우면 결국 $\sum \frac{1}{2^k} \binom{k}{n-1}$와 주어진 사람의 수 $k_i$에 대하여 $\sum \frac{1}{2^k} \binom{k}{n-k_i-1}$을 주어진 $k$의 구간에 대하여 빠르게 계산해야 한다는 결론이 나온다.
이 식을 빠르게 계산하는 방법은 잘 모르겠고 (식을 잘 조작하면 $\sum_{i=l}^r \binom{n}{i}$를 빠르게 계산하는 것과 동치다) 이 문제에서는 가능한 $k_i$의 종류가 대충 800개 이하이므로 (합이 20만 이하니까) 이를 이용해서 $\mathcal{O}(n \sqrt{\sum k_i})$로 문제를 해결할 수 있다. 여러모로 재미없는 문제였다. 구현이 좀 힘들었다.
조건이 무섭게 생겼는데, 이를 해석하면 각 연결 컴포넌트의 크기가 6 이하란 것이다. 귀류법으로 크기 7 이상인 연결 컴포넌트가 있다면, $A$를 적당히 잡아서 임의의 $a, b \in A$에 대하여 $A$에 속한 정점만을 통해서 $a$에서 $b$로 가는 경로가 존재하도록 할 수 있다. 그러니 모순을 얻는다.
그러니 각 컴포넌트의 채색다항식을 "상태 압축" 백트래킹 + Lagrange Interpolation으로 얻을 수 있다. Project Euler 194, 544를 참고하면 좋을 것 같다. 이제 답을 구해야 하는데, 정점의 개수가 6 이하인 그래프 중 서로 non-isomorphic한 것의 개수가 200개 정도니 200개 이하의 서로 다른 채색다항식 $p$에 대하여 $p(1), p(2), \cdots p(n)$을 naive하게 계산하면 된다. Project Euler에서 배운 것을 많이 써먹을 수 있었던 문제였다.
이 경우, $a=0$, $b=0$인 경우를 제외하면 중요한 것은 $a, b$ 자체가 아니라 $a \cdot b^{-1} \pmod{p}$만이 중요하다.
그러니 $a=0$이나 $b=0$인 경우를 먼저 처리하고, 조건을 만족하는 $a \cdot b^{-1}$의 값을 모두 구하자.
여기까지는 (역원을 미리 전처리한다면) $\mathcal{O}(p)$에 가능하다. 이제 각 $t$에 대하여 $a \cdot b^{-1} \equiv t \pmod{p}$인 $a, b \in S$의 개수를 빠르게 구하는 방법을 구하자. 양변에 "로그"를 취하면 이는 FFT로 해결할 수 있는 문제의 형태임을 알 수 있다. $\pmod{p}$ 합동식의 입장에서 로그를 취하는 방법은 원시근 $g$를 잡는 것이다. 이제 모든 것을 적당히 정리해주면 $\mathcal{O}(p \log p)$에 문제를 해결할 수 있다. 문제가 더러워 보이는 것을 제외하면 재밌었다.
식 형태가 convolution이고, 여러모로 상황이 XOR, AND, OR-convolution과 비슷하다는 것을 알 수 있다.
FWHT의 근본은 결국 비트별로 변수를 쪼갠다음 각 변수마다 적당히 convolution을 해서 합치는 것이다.
여기서도 비슷하게 할 수 있다. 하지만 convolution 각을 재기가 까다로운데, 기존 FFT, FWHT처럼 "다항식에 값을 대입한다"라는 생각보다는 행렬변환 -> 단순 "pointwise" 곱셈 -> 행렬변환을 통해서 convolution을 해야겠다는 생각을 해야하기 때문이다. 게다가 단순히 $0, 1, 2$의 개수를 가지고 식을 세우려 하면 터지고, 식을 하나 추가해야 convolution을 할 수 있는 형태의 식이 나오게 된다. 여러모로 빡센 문제. 코드는 FWHT에 살짝 변형을 주면 된다.
그런데 FWHT처럼 구현했는데 맞는 이유는 솔직히 잘 모르겠다. 그냥 [각 "비트"별로 convolution을 하는 방법을 고안한 다음 FWHT처럼 짜면 되겠지]라고 생각해서 짰는데, 생각해보니까 FWHT는 multivariable polynomial처럼 생각하면 이해는 되는데 지금 하는 거는 그거랑은 또 달라서... 좀 생각해봐야 할 것 같다. 에디토리얼 찾아봐야 할 듯. Kronecker Product에 뭔가 큰 그림이 있는 것 같기도 하고 ㅋㅋ FWHT 구현 원리부터 다시 봐야겠다.
예전에 koosaga 블로그에서 키워드 Berlekamp-Massey를 봐서 빠르게 풀 수 있었다. 그때는 내가 이걸 진짜 풀 줄 몰랐지...
$p_k$을 $k$번째 시행에서 처음으로 $n$번 정점에 도착할 확률이라고 하자. "처음으로"라는 조건을 그래프로 모델하려면, $n$번 정점에 도착하면 무조건 가상의 $n+1$번 정점으로 가고, $n+1$번 정점에서는 $n+1$번 정점으로만 갈 수 있도록 하면 된다.
Random Walk하면 Markov Chain이고 결국에는 행렬이다. 그러니 $p_k$는 선형점화식을 따른다.
행렬의 크기가 $n$ 근처니 결국 점화식의 크기도 $n$ 근처다. 즉, 초기항 $2n$개 정도를 직접 $\mathcal{O}(nm) = \mathcal{O}(n^2)$ (planar graph에서 $|E| \le 3|V|-6$)에 구한 다음, Berlekamp-Massey를 돌려서 선형점화식을 구할 수 있다. 이제 우리의 목표는 $\sum_{k=0}^\infty kp_k$를 계산하는 것이다.
이는 생성함수를 이용하여 할 수 있다. $f(x) = \sum_{k=0}^\infty p_k x^k$라고 하자.
$p_k$의 점화식을 알고 있기 때문에, 이를 활용하여 $f(x) = \frac{P(x)}{Q(x)}$가 성립하는 다항식 $P, Q$를 구할 수 있다.
목표는 $f'(1)$과 같고, $P, Q$를 계산하고 미분하는 것은 어렵지 않게 $\mathcal{O}(n^2)$에 할 수 있다.
이를 이용하여 증명을 할 수 있다. $G$가 조건을 만족하려면 $G$의 최대 매칭의 크기는 $n-1$이어야 한다.
그러니 $|U|-\operatorname{odd}(G-U)+2n = 2n-2$인 정점의 집합 $U \subset V$가 존재한다.
즉, $\operatorname{odd}(G-U) = |U|+2$인 $U$가 있다. $G$에 임의의 $G$에 없는 간선을 추가한 뒤에는 이 $U$에 대해서도 $\operatorname{odd}(G-U) = |U|$가 성립해야 한다.
즉, $G$에 없는 간선은 전부 크기가 홀수인 컴포넌트 두 개를 잇는 간선이어야 한다. 이는 정말 강력한 조건이고, 여기서 정말 많은 정보를 얻어낼 수 있다.
우선 $G-U$의 각 컴포넌트는 전부 크기가 홀수여야 한다. 크기가 짝수인 컴포넌트가 있으면, "크기가 홀수인 컴포넌트 두 개를 잇는 간선"이 아니면서 $G$에 존재하지 않는 간선이 존재하게 되므로 모순이다. 비슷한 이유로, $G-U$의 각 컴포넌트는 전부 clique여야 한다. clique가 아니면, 컴포넌트 내부에서 그을 수 있는 간선이 있으므로 모순이다. 또한, 삭제한 정점의 집합 $U$에 속한 정점들은 차수가 $2n-1$이어야 한다. 차수가 $2n-1$이 아니면, 새로 그을 수 있는 간선이 존재하게 되기 때문이다. 이제 이를 종합하면, 원하는 그래프를 전부 classify 할 수 있다.
결론은 $G$가 차수 $2n-1$인 정점 $k$개와, 크기가 홀수이고 서로 "독립적인" clique $k+2$개로 분할된다는 것이다.
$k$를 고정하고 생각하면, 이때 $G$로 가능한 그래프의 개수는 홀수 $k+2$개의 합으로 $2n-k$를 만드는 경우의 수다.
이는 식을 잘 조작하면 $k+2$개의 자연수의 합으로 $n+1$을 만드는 경우의 수가 된다.
이를 각 $k \ge 0$에 대하여 더하면, $p(n+1)-1$이 답임을 알 수 있고, 증명이 끝난다.
$\prod_{d|n} \Phi_d(x) = x^n-1$이고 $\Phi_d(x)$ 각각이 irreducible polynomial이므로, 문제는 결국 $\Phi_d$를 구하라는 것이다.
첫 아이디어로 가능한 것은 $\Phi_n(x) = \frac{x^n-1}{\prod_{d|n, d \neq n} \Phi_d(x)}$를 써서 계산하는 것인데, 이 방법은 간단하지 않은 다항식 나눗셈을 많이해야 하므로 비효율적이다.
여기서는 뫼비우스 반전을 생각할 수 있다. 결국 양변에 로그를 취한 다음 뫼비우스 반전을 적용하면, $\Phi_n(x) = \prod_{d|n} (x^d-1)^{\mu(n/d)}$를 얻는다. $x^d-1$ 형태의 다항식은 곱하기도 나누기도 간단하니, 계산을 효율적으로 할 수 있다. 특히, $\mu(n/d) \neq 0$인 경우에만 연산을 하면 되므로 연산 횟수도 생각보다 적다. 계산을 할 때, 먼저 곱할 다항식을 다 곱한 후 나눌 다항식을 나눠주는 게 좋다. 출력 형식을 맞춰주는 것은 적당히 정렬 하면 된다.
문제를 적당히 해석한 뒤 Jimp Number가 정확히 어떤 자연수인지 classify 하는 것은 귀찮지만 어렵지는 않다.
결국 문제는 $n$ 이하 소수의 개수와, $n$ 이하 $4k+3$ 꼴 소수의 개수를 구하는 문제로 전환된다.
$n$ 이하 소수의 개수를 동적계획법으로 $\mathcal{O}(n^{3/4})$에 구하는 방법을 알고 있다면, 이를 간단하게 확장하여 $n$ 이하 $4k+3$ 꼴 소수의 개수를 구하는 $\mathcal{O}(n^{3/4})$ 알고리즘을 설계할 수 있다. 사실 앞에 $\phi(4)=2$라는 상수가 붙는다. 아무튼 이걸 짜면 아슬아슬하게 통과가 된다.
결국 Project Euler 611의 하위호환. 이 문제가 classify 난이도 및 케이스 분석 면을 봤을 때 훨씬 더 어려운 문제 같다.
사실 위에서 언급한 동적계획법은 top-down과 bottum-up 방식을 모두 활용한 뒤, offline query + fenwick tree를 이용하여 $\mathcal{O}(n^{2/3})$으로 최적화가 가능하다. 아니면 아예 Meissel-Lehmer Algorithm를 이용할 수도 있다. 확장이 잘 되는지는 모르겠다. 이런 방법들을 구현해야만 풀 수 있는 문제였다면 훨씬 더 어려운 문제가 되었을 것 같다. 정해는 offline query + fenwick tree로 최적화 하는 방법을 사용하는 것 같다. 이것도 한 번 짜보기는 해야될 듯.
다른 풀이로는 segmented sieve를 조져서 DB를 제작하는 풀이가 있었다고 한다. 엌ㅋㅋㅋㅋㅋㅋㅋㅋ
대충 생각하면, 가장 가까운 점이 삼각형 내부에 들어오지 못하도록 \(C'\)을 잡으려면 \(AC'\) 또는 \(C'B\)의 기울기가 굉장히 작은 interval 안에 들어가야 하고, Stern-Brocot Tree의 원리에서 그 interval 안에 들어가려면 \(AC'\) 또는 \(C'B\)의 길이가 \(AB\)보다 커진다는 것을 증명할 수 있다. 디테일은 생략.
지금 생각하는 건데, '가장 가까운 점'에 대한 추측을 하면 이분탐색 + 변 기준 CCW로도 해결할 수 있을 것 같다.
그런데 이걸 쉽게 하려면 (아마) __int128이 필요할 것이다. Atcoder에서 __int128을 지원하는지는 모르겠다.
이런 카운팅 문제는 보통 (원순열처럼) 가능한 경우의 수를 naive하게 센 다음 중복을 제거하는 방식으로 해결한다.
naive하게 세는 방법은 \([1,k]\) 부분과 \([k+1,n]\) 부분이 각각 palindrome이 되는 문자열의 개수를 전부 더하는 방법이다.
중복이 되는 경우는 어떤 경우일까? 두 정수 \(p, q\)가 존재하여, \([1,p],[1,q],[p+1,n],[q+1,n]\)이 모두 palindrome이 되는 문자열은, 중복되어 세질 것이다. 이런 문자열들은 주기가 있는 문자열이라는 것을 어렵지 않게 파악할 수 있다.
이를 기반으로, 중복되어 세질 문자열 \(S\)를 잡고 \(S=RRR\cdots R\) 형태로 써보자. 단, \(R\)을 minimal하게 잡자.
그러면 \(R\)이 어떠한 형태를 가져야 하는지 알 수 있고, 이때 \(S\)가 얼마나 중복되어 세지는 지 파악할 수 있다.
이 과정을 모두 마쳤다면, 답에 대한 일종의 점화식을 설계할 수 있을 것이다. 코드는 매우 간단하다.
\(a, m, L, R\)에 대한 문제를 작은 문제로 환원할 수 있다. \(a-m \pmod{a}, a, L \pmod{a}, R \pmod{a}\)에 대한 문제로 환원해보자.
방법 2: Binary Search + Lattice Point Counting Algorithm (koosaga님에게 들은 풀이)
주어진 문제를 \(ax+my \le mT+L-1\)인 Lattice Point의 개수와 \(ax+my \le mT+R\)인 Lattice Point의 개수가 달라지는 최소의 \(T\)를 계산하는 문제로 바꿀 수 있다. 이는 Binary Search가 가능한 형태임을 알 수 있고, 남은 것은 삼각형 형태의 영역에서 Lattice Point의 개수를 세는 것이다.
물론, 여기서 Lattice Point는 \(x, y \ge 0\)이고 \(x, y\)가 모두 정수인 \((x,y)\)를 말한다.
이 문제는 다시 "유클리드 알고리즘처럼 문제 환원하기" 테크닉을 사용하여 해결할 수 있는 문제다. 직접 해보자.
나머지는 그냥 깡구현이다. 여러모로 많은 것을 배울 수 있던 문제였다. Project Euler 700번도 이 방식으로 풀 수 있다.
각 \(0 \le i < p^e\)에 대하여 \(f(i,p,e)\)를 전처리하면, \(f(m,p,e)\)를 로그 시간에 계산할 수 있다.
한편, \(f(m,p,e)\)는 \(p\)와 서로소이므로, \(\pmod{p^e}\)에 대한 modular inverse를 생각할 수 있다.
이제 \(f(m,p,e)\)의 정의에서 \(\frac{f(m,p_i,e_i)}{f(n,p_i,e_i) \cdot f(m-n, p_i, e_i)} \equiv \prod_{j \neq i} p^{f_j}_j \cdot X \pmod{p^{e_i}_i}\)임을 알 수 있다.
이 식에서 modular inverse 등을 적당히 계산하면 \(X \pmod{p^{e_i}_i}\)를 계산할 수 있다.
각 \(S_i\)가 \(G\)의 independent set이고, \(\sum_{i=1}^r |S_i| = n\), \(\cup_{i=1}^r S_i = [n]\)인 \(r\)-tuple \((S_1, S_2, \cdots , S_r)\)의 개수를 \(p(r)\)이라 하자. independent set으로 그래프를 분할한 것이다. 그러면 \(\chi_G(k) = \sum_{r=1}^n \binom{k}{r} p(r)\)가 성립한다.
그러니 여기에 \(k=-1\)을 대입하여 \(\chi_G(-1) = \sum_{r=1}^n (-1)^r p(r)\)임을 알 수 있다.
각 \(X \subseteq [n]\)에 대하여, 각 \(S_i\)가 \(G\)의 independent set이고 \(\sum_{i=1}^r |S_i| = n\)이며 각 \(i\)에 대해 \(S_i \cap X = \emptyset\)인 \(r\)-tuple \((S_1, S_2, \cdots , S_r)\)의 개수를 \(a_r(X)\)라고 정의하자. 포함-배제의 원리를 생각하면, \(p(r) = \sum_{X \subset [n]} (-1)^{|X|} a_r(X)\)가 성립한다. 정리하면 \(\chi_G(-1) = \sum_{X \subseteq [n]} \sum_{r=1}^n (-1)^{r+|X|} a_r(X)\)를 얻는다.
이제 \(X\)를 고정하고 생각하자. \(dp[i][j]\)를 [크기의 합이 \(j\)]인 [\(i\)개의 independent set]을 선택하는 방법의 수라고 하자.
선택 순서는 중요하고, 각 independent set은 \([n] \setminus X\)에 속해야 한다. 크기가 \(k\)이고 \(X\)에 속하는 independent set의 개수를 \(S(X, k)\)라 하면 \(dp[i][j] = \sum_{k=1}^j dp[i-1][j-k] \cdot S([n] \setminus X, k)\)가 된다. 물론 \(a_r(X) = dp[r][n]\).
\(S(X, k)\)의 값들을 이미 계산했다고 생각하면, DP 테이블을 채우는데 \(\mathcal{O}(n^3)\)의 시간이 필요하다. 이를 각 \(X\)에 대해서 계산하려면 \(\mathcal{O}(n^3 2^n)\)의 시간이 필요해 TLE를 받는다. 하지만 우리가 계산해야 하는 값은 \(\sum_{r=1}^n (-1)^r a_r(X)\)이니, \(r\)의 홀짝성만 알면 된다. 그러니 DP 테이블의 정의를 변형할 수 있다. independent set의 개수 대신, 개수의 홀짝성만을 생각하면 된다. 이를 이용하면 DP 테이블을 \(\mathcal{O}(n^2)\)에 계산할 수 있고, 전체적으로 \(\mathcal{O}(n^2 2^n)\)의 시간에 계산을 마칠 수 있다.
이제 남은 것은 \(S(X, k)\)의 값을 빠르게 계산하는 것이다. 먼저 각 \(2^n\)개의 부분집합이 independent set인지 여부를 미리 전처리하자. 이제 \(|X|=k\)이고 \(X\)가 independent set이면 \(F(X, k)=1\)이라고 두고, 그렇지 않으면 \(F(X, k)=0\)이라 하자. 여기까지는 \(\mathcal{O}(n2^n)\)에도 할 수 있다. 한편, \(S(X,k) = \sum_{Y \subseteq X} F(Y, k)\)가 된다. 이는 Sum overSubsets DP 테크닉을 이용하면 \(\mathcal{O}(n^22^n)\)에 계산할 수 있다. 이렇게 하면 모든 과정을 \(\mathcal{O}(n^2 2^n)\)에 할 수 있다. 끝.
굉장히 어려운 방법이지만, 이 풀이에서 배울 수 있는 점은 많다고 생각한다. 포함-배제 관련 테크닉은 다 할 수 있을 듯.
특히, 다른 사람들이 분할-정복 등의 복잡한 방법을 선택한 문제인 이 문제도 굉장히 쉽게 해결할 수 있다.
\( W = \{0, 1, \cdots , 9\}\)라고 하자. 마나 \(i\)의 양을 \(x_i\)라 하자.
또한, \(i\)번째 경우에서 \(j\)번째 마나가 증가하는 양을 \(f_{i,j}\)라 하자.
\(T\)번의 수련 이후에 어떤 확률변수 \(X\)의 기댓값을 \(E(X, T)\)라 하자.
각 \(S \subseteq W\)에 대하여 확률변수 \(\prod_{i \in S} x_i\)를 \(m_S\)라 하자.
특히, 특별히 (abuse of notation) \(E(S, T) = E(m_S, T)\)라고 정의하자.
또한, \(A^T \cdot E(X, T) = P(X, T)\)라 하고, 마찬가지로 \(P(S, T) = P(m_S, T)\)라 하자.
즉, \(P(X, T)\)는 가능한 모든 경우에 대한 \(X\)의 합이다. 이제 문제를 풀어보자.
\(\displaystyle E(S, T) = \frac{A - \sum_{i=1}^N P_i}{A} E(S, T-1) + \sum_{i=1}^N \frac{P_i}{A} \cdot E(\prod_{j \in S} (x_j+f_{i,j}), T-1) \)이 성립함을 알 수 있다.
이를 정리하면, \(\displaystyle E(S, T) = E(S, T-1) + \sum_{S' \subsetneq S} \text{coef}_{S', S} \cdot E(S', T-1) \) 형태의 식을 얻는다.
그런데 식을 자세히 보면, \(\displaystyle \text{coef}_{S', S} = \sum_{i=1}^N \frac{P_i}{A} \cdot \prod_{j \in S \setminus S'} f_{i,j}\)가 된다. 즉, \(\text{coef}_{S', S}\)는 사실 \(S \setminus S'\)에 의해서만 결정된다.
이제 각 \(S \subseteq W\)에 대해서 \(P(S, 0)=1\)임을 생각하자. 그러면 \(P(S, T)\)는 [\(S\)에서 끝나고 \(T\)개의 간선으로 이루어진 모든 path]의 가중치를 더한 값임을 알 수 있다. 한편, 각 경로에서 self-loop가 아닌 간선은 최대 \(10\)개 뿐이다. 또한, 모든 self-loop의 가중치는 \(A\)로 동일하다. \(dp[S][i]\)를 [\(S\)에서 끝나고 \(i\)개의 [self-loop가 아닌 간선]만으로 이루어진 모든 path]의 가중치를 더한 값이라고 정의하자. 그러면 \(\displaystyle dp[S][i] = \sum_{S' \subsetneq S} dp[S'][i-1] \cdot c_{S \setminus S'}\)가 된다. DP 테이블을 채우는 것은 \(\mathcal{O}(10 \cdot 3^{10})\) 시간에 할 수 있다. 그러면 \(\displaystyle P(S, T) = \sum_{i=0}^{\text{min}(10, T)} dp[S][i] \cdot A^{T-i} \cdot \binom{T}{i} \)가 된다. \(A^{T-i}\)는 경로에서 \(T-i\)번 self-loop를 이용한 것에서 나오고, \(\binom{T}{i}\)는 \(T\)번의 간선 이동 중 언제 self-loop를 이용할 지를 결정하는 과정에서 나온다. 이항 계수는 \(i\)가 작으니 직접 계산하면 된다. 답은 \(P(W, T)\)다. 끝.
\(4^a(8b+7)\) 형태의 자연수가 아니면, 3개의 제곱수의 합으로 표현할 수 있다. (르장드르의 세 제곱수 정리)
임의의 \(4k+3\)꼴 소수 \(p\)에 대하여 \(v_p(n)\)이 짝수면, 2개의 제곱수의 합으로 표현할 수 있다. (페르마의 두 제곱수 정리 활용)
마지막으로, 당연히 제곱수는 1개의 제곱수의 합으로 표현할 수 있다.
그러니 필요한 제곱수의 개수는 pollard-rho 소인수분해를 이용하면 쉽게 판별할 수 있다. 여기까지가 이 문제.
이제 제곱수의 합으로 표현하는 방법을 생각해보자. 제곱수 1개가 필요한 경우에는 딱히 설명할 필요도 없다.
\(N\)을 표현하기 위해 제곱수 4개가 필요한 경우를 먼저 보자. \(N=4^a(8b+7)\)이라고 하자.
\(8b+6\)은 제곱수 3개로 표현할 수 있으므로, 그 방법을 찾아서 \(8b+6=x^2+y^2+z^2\)이라 하자.
그러면 \(N = (x \cdot 2^a)^2 + (y \cdot 2^a)^2 + (z \cdot 2^a)^2 + (2^a)^2\)이 된다. 끝.
\(N\)을 표현하기 위해 제곱수 3개가 필요한 경우를 보자.
\(x\) 이하의 자연수 중 두 제곱수의 합으로 표현될 수 있는 수의 개수는 대략 \(\displaystyle K \cdot \frac{x}{\sqrt{\ln x}}\)임이 알려져 있다.
여기서 \(K\)는 Landau-Ramanujan 상수다. 즉, 임의의 \(t\)를 하나 잡으면, \(N-t^2\)이 두 제곱수의 합으로 표현될 확률이 그렇게 나쁘지는 않다는 것이다. 그러니 \(t\)를 \(1\)부터 점점 증가시키면서, \(N-t^2\)을 두 제곱수의 합으로 표현하려고 시도하는 것을 반복하자. 성공하면 \(N-t^2=x^2+y^2\)을 얻고, 이는 결국 \(N=x^2+y^2+t^2\)이 된다. 끝.
이제 \(N\)을 표현하기 위해 제곱수 2개가 필요한 경우를 보자.
\(N = T^2 \cdot p_1p_2 \cdots p_k\)라고 쓰자. 단, \(p_i\)들은 서로 다르며, \(2\)거나 \(4k+1\) 꼴 소수다.