매직 마스터합니다 (2019 아시아 난창 (南昌) 1 라운드에서 온라인 프로그래밍 대회)

요한은 마법의 마스터뿐만 아니라 셔플 마스터뿐만 아니라.  

그가 유명하지만, 그는 환상적인 셔플 기술과 게임을하여 팬들과 상호 작용 좋아. 

다음과 같이 게임을 보여줍니다 

그는 처음 부지깽이의 갑판에 포함 된 표시  N N 카드 색인  1, 2, \ 점, N 1 , 2 , ... , N 및 모든 카드가 동일합니다. 그는면이 앞면과 뒷면 같은 다른 측면으로 번호를 포함 말한다. 나중에 그는 그의 팬 중 하나가 양의 정수 선택하는 선택  M의 크지보다 M  (10) (1) 그 후 0, 그가 의도적으로 카드를 셔플하고 바탕 화면에 올려 놓는 것이다. 이 순간에 카드의 전면 측면 책상에 직면하고 있습니다. 

책상에 카드가없는 때까지, 선택한 팬들은 다음 단계를 수행해야합니다. 

  1. 존의 손에 더미의 상단에 카드를 놓습니다. 그의 손에 이미 일부 카드가있는 경우, 그 상단에 넣어. 
  2. 책상에 카드가 남아있는 경우 :

(a)는 그것의 바닥에 말뚝의 상단에서 카드를 넣습니다.

(b) 단계 (실행 의 a)  M M 번.

(c) 단계로 이동  1.

다음으로, 기적을 목격 할 때입니다.  

요한은 계속 아래로 그의 손 위에 카드를 전복 것입니다, 우리는 카드가 감소하는 순서로 항상 찾을 수 있습니다. 

어느 날, 존의 팬 중 하나는, 톰, 스마트 JBer이 마법의 열쇠를 이해한다. 그는 당신에게 돌아 서서 마법의 열쇠는 요한이 이전과 셔플이라고 코멘트. 임의의 숫자를 들어  M M, 그는 셔플 후 특정 순서로 카드를 켜집니다. 톰만큼 똑똑하지, 당신은의 인덱스 찾아야한다  K 셔플 후 더미의 상단에서 K 번째 카드.

입력

첫 번째 라인은 양의 정수를 포함  T (1 \ 르 T의 \ le10의) T ( 1 T 1 0 테스트 케이스의 수 -).

각 시험의 경우에, 첫 번째 라인은 양의 정수 포함  N을 (1 \ 르 N \ 르 40000000) N은 ( 1 N 4 0 0 0 0 0 0 0 등) numberof 카드를 나타낸다.

두번째 라인은 양의 정수를 포함  M (1 \ 르 M \ 르 10) M ( 1 M 1 0 개수 팬 선택 -).

세번째 줄은 정수 포함  Q (1 \ 르 Q \ 르 100) Q ( 1 Q 1 0 0 이 있음을 나타내는 -)  Q Q 질문.

이어서, 거기  Q 정수와 Q 선, 각  K (1 \ 르 K \ 르 N) K ( 1 K N 쿼리를 나타내는이 -).

산출

각 쿼리의 경우, 출력의 인덱스해야 당신  K 셔플 후 더미의 상단에서 K 번째 카드.

샘플 입력

1 
5 
1 
2 
2 
3

샘플 출력

5 
2

샘플 해석

샘플 설명 - 셔플 후 카드의 indexs는 다음과 같습니다 :  1 ~ 5 ~ 2 ~ 4 ~ 3 1 5 2 4 3 (왼쪽 상단입니다)    

사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <알고리즘> 
#INCLUDE <큐> 
#INCLUDE <적층>
 사용  스페이스 성병; 
타입 정의  LL;
INT의 ANS [ 40000000 ];  < INT > Q; INT (X);
INT ) (주 
{ 
    N 버리는, m; 
    LL의 t]는 scanf ( " %의 LLD " , t);
    반면 (t-- ) 
    {는 scanf ( " %의 LLD의 %의 LLD " , N, m);
        동안 (! q.empty ()) 
            q.pop (); 
        위한 ( int로 I = N; I> 1 , 난 - ) 
        { 
            q.push (I); 
             ( INT의 J = 1 ; J <= m; J ++ ) 
            { 
                 LL의 K = q.front (); 
            q.pop (); 
            q.push (K); 
            } 
        } 
        ANS [ 1 ] = 1 ;
        위한 ( int로 I = N; I> 1 , 난 - ) 
        { 
            ANS [I]= q.front ();
            // COUT << ANS [I] << '; 
            q.pop (); 
        } 
        INT의 FF]는 scanf ( " %의 D " , FF);
        위한 ( int로 I = 1 ; i가 = FF로를 <I가 ++ ) 
        { 

            는 scanf ( " %의 D ' , X)을; 
            의 printf ( " % D \ 없음 " , ANS [X]); 
        } 
    } 
}

 

추천

출처www.cnblogs.com/Shallow-dream/p/11488851.html