Game with Polynomials

P(x+c) = Q(x)이고 P의 0이 아닌 항이 ceil(log2(N+1))개 이하일 때, Q의 계수에서 c와 P의 항들을 복원한다.

어려움8수학조합론정수론구현면접 대비아직 제출이 없습니다시간 제한1초메모리 제한512 MB

문제

이 문제에서

  • 편의상 00:=10^{0} := 1로 둡니다.

  • p=109+7p = 10^{9} + 7로 고정합니다. 이 수는 소수입니다.

  • 모든 다항식 계산은 Z_p\mathbb{Z}\_{p}에서 이루어집니다. 즉,

    • (2x)(-2x)(p2)x(p - 2)x와 같은 다항식입니다.
    • (x+p1)(x + p - 1)(x+2)(x + 2)를 더하면 (2x+1)(2x + 1)입니다.

키파는 이런 인터랙티브 문제를 내려고 했습니다.

다음과 같은 함수를 호출할 수 있습니다:

  • evaluate(x): x를 다항식 Q(x)Q(x)에 대입한 후 pp로 나눈 나머지를 돌려줍니다.

evaluate 함수의 호출을 최대 2N2N번 할 수 있습니다. 당신의 프로그램은 입력으로 NN을 받아 Q(x)Q(x)의 계수를 출력해야 합니다.

그런데, 테스트 케이스를 준비하면서 최대 2N2N개의 수에 대해 차수가 NN인 다항식을 평가하는 것은 O(N2)\mathcal{O}(N^{2})이라는 것을 깨달았습니다! 키파는

evaluate의 각 call은 O(logN)\mathcal{O}(\log N)만에 돌아옴이 보장되고, F 어쩌구 알고리즘을 사용하면 값을 알 때 다항식을 NlogNN \log N에 구할 수 있기 때문에, 전체 시간복잡도는 O(NlogN)\mathcal{O}(N \log N)입니다!

라고 에디토리얼에 쓰고 싶었기 때문에, 다음과 같이 다항식 Q(x)Q(x)를 만들었습니다:

  1. 차수가 NN이고 최대 log_2(N+1)\left\lceil\log\_{2}(N+1)\right\rceil개의 계수만이 0이 아닌 다항식 P(x)P(x)를 준비합니다.
  2. 어떤 상수 cc에 대해, P(x+c)=:Q(x)P(x + c) =: Q(x)를 계산합니다.

이렇게 만들 수 있는 다항식 Q(x)Q(x)키파 다항식이라고 부릅시다.

테스트 케이스가 너무 약하죠? 문제의 검수진인 실버는 검수비를 많이 받기 위해 키파 다항식 Q(x)Q(x)의 계수가 주어졌을 때 ccP(x)P(x)를 빠르게 구하는 코드를 짜서 키파의 뚝배기를 깨고 싶었습니다. 그러나 실버는 이 일을 하기에는 너무 귀찮았기 때문에, 여러분에게 이 일을 떠넘겼습니다. 이 일을 해결해 줄 수 있나요?

입력

첫째 줄에 31053\cdot 10^{5} 이하의 양의 정수 NN이 주어집니다.

둘째 줄에 (N+1)(N+1)개의 정수 a_Na\_{N}, a_N1a\_{N-1}, \cdots, a_0a\_{0}이 공백을 사이에 두고 주어집니다. 이 수는 00 이상 pp 미만이며,Q(x)=_i=0Na_ixiQ(x)=\sum\_{i=0}^{N}{a\_{i}x^{i}}로 주어집니다.

주어지는 다항식은 키파 다항식임이 보장됩니다.

출력

첫째 줄에 00이 아닌 항의 개수 kkP(x+c)=Q(x)P(x + c) = Q(x)를 만족하는 cc를 출력합니다. kklog_2(N+1)\left\lceil\log\_{2}(N+1)\right\rceil보다 작거나 같은 양의 정수여야 하며, cc00 이상 pp 미만의 정수여야 합니다.

1jk1 \leq j \leq k인 모든 jj에 대하여, (j+1)(j+1)번째 줄에 각각 두 개의 정수 c_jc\_{j}d_jd\_{j}를 공백을 사이에 두고 출력합니다. c_jc\_{j}11 이상 pp 미만의 정수여야 하고, d_jd\_{j}00 이상 NN 이하의 서로 다른 정수여야 하며,Q(x)=P(x+c)=_j=1kc_j(x+c)d_jQ(x) = P(x+c) = \sum\_{j=1}^{k} c\_{j}(x+c)^{d\_{j}}를 만족해야 합니다.

조건을 만족하는 cc가 여러 개 있다면 아무 거나 하나 출력해도 됩니다.