홍준이는 FFT를 좋아해
시간 제한2초메모리 제한512 MB
주어진 의사코드로 순열 a와 0/1 배열 b를 만든 뒤, c[i] = max(a[j]*b[i-j])를 계산해 출력한다.
문제
홍준이는 Fast Fourier Transform(FFT)을 좋아해서 자주 씁니다.
FFT는 합성곱을 계산하는 알고리즘입니다. 길이가 이고 0번째 원소부터 번째 원소까지 있는 수열 , 가 있을 때, FFT는 아래와 같이 정의된 수열 를 빠르게 구해 줍니다.
홍준이는 이 식에서 합을 최댓값으로 바꿔 보았습니다.
계산하기 편하도록 홍준이는 수열 가 부터 까지의 수를 한 번씩 담고, 수열 는 원소가 0 또는 1인 경우만 생각합니다. 곱한 값이 모두 0이면 도 0입니다. 수열 와 가 정해졌을 때 수열 를 구하는 프로그램을 작성하세요.
홍준이는 게을러서 수열 와 의 원소를 일일이 알려주는 것조차 귀찮아합니다. 그래서 세 정수 , , 만 주고, 아래 의사코드대로 두 수열을 직접 만들기를 바랍니다. %는 나머지를 구하는 연산이고, swap()은 두 값을 교환하는 함수입니다. 의사코드를 따르면 에는 1이 정확히 개 들어갑니다.
//x is 64-bit variable;
function getNextX() {
x = (x * 37 + 10007) % 1000000007;
return x;
}
function initAB() {
for(i = 0; i < n; i = i + 1){
a[i] = i + 1;
}
for(i = 0; i < n; i = i + 1){
swap(a[i], a[getNextX() % (i + 1)]);
}
for(i = 0; i < n; i = i + 1){
if (i < d)
b[i] = 1;
else
b[i] = 0;
}
for(i = 0; i < n; i = i + 1){
swap(b[i], b[getNextX() % (i + 1)]);
}
}
입력
첫째 줄에 세 정수 , , 가 공백을 사이에 두고 주어집니다. (, )
출력
수열 의 원소를 0번째부터 번째까지 차례대로 공백을 사이에 두고 한 줄에 출력합니다.