P(x+c) = Q(x)이고 P의 0이 아닌 항이 ceil(log2(N+1))개 이하일 때, Q의 계수에서 c와 P의 항들을 복원한다.
어려움8수학조합론정수론구현면접 대비아직 제출이 없습니다시간 제한1초메모리 제한512 MB이 문제에서
편의상 00:=1로 둡니다.
p=109+7로 고정합니다. 이 수는 소수입니다.
모든 다항식 계산은 Z_p에서 이루어집니다. 즉,
키파는 이런 인터랙티브 문제를 내려고 했습니다.
다음과 같은 함수를 호출할 수 있습니다:
evaluate(x):x를 다항식 Q(x)에 대입한 후 p로 나눈 나머지를 돌려줍니다.
evaluate함수의 호출을 최대 2N번 할 수 있습니다. 당신의 프로그램은 입력으로 N을 받아 Q(x)의 계수를 출력해야 합니다.
그런데, 테스트 케이스를 준비하면서 최대 2N개의 수에 대해 차수가 N인 다항식을 평가하는 것은 O(N2)이라는 것을 깨달았습니다! 키파는
evaluate의 각 call은 O(logN)만에 돌아옴이 보장되고, F 어쩌구 알고리즘을 사용하면 값을 알 때 다항식을 NlogN에 구할 수 있기 때문에, 전체 시간복잡도는 O(NlogN)입니다!
라고 에디토리얼에 쓰고 싶었기 때문에, 다음과 같이 다항식 Q(x)를 만들었습니다:
이렇게 만들 수 있는 다항식 Q(x)를 키파 다항식이라고 부릅시다.
테스트 케이스가 너무 약하죠? 문제의 검수진인 실버는 검수비를 많이 받기 위해 키파 다항식 Q(x)의 계수가 주어졌을 때 c와 P(x)를 빠르게 구하는 코드를 짜서 키파의 뚝배기를 깨고 싶었습니다. 그러나 실버는 이 일을 하기에는 너무 귀찮았기 때문에, 여러분에게 이 일을 떠넘겼습니다. 이 일을 해결해 줄 수 있나요?
첫째 줄에 3⋅105 이하의 양의 정수 N이 주어집니다.
둘째 줄에 (N+1)개의 정수 a_N, a_N−1, ⋯, a_0이 공백을 사이에 두고 주어집니다. 이 수는 0 이상 p 미만이며,Q(x)=∑_i=0Na_ixi로 주어집니다.
주어지는 다항식은 키파 다항식임이 보장됩니다.
첫째 줄에 0이 아닌 항의 개수 k와 P(x+c)=Q(x)를 만족하는 c를 출력합니다. k는 ⌈log_2(N+1)⌉보다 작거나 같은 양의 정수여야 하며, c는 0 이상 p 미만의 정수여야 합니다.
1≤j≤k인 모든 j에 대하여, (j+1)번째 줄에 각각 두 개의 정수 c_j와 d_j를 공백을 사이에 두고 출력합니다. c_j는 1 이상 p 미만의 정수여야 하고, d_j는 0 이상 N 이하의 서로 다른 정수여야 하며,Q(x)=P(x+c)=∑_j=1kc_j(x+c)d_j를 만족해야 합니다.
조건을 만족하는 c가 여러 개 있다면 아무 거나 하나 출력해도 됩니다.