松鼠喫果子

描述

有N個一種松鼠喜歡喫的果子由下向上串排成一列,並標號1,2,...N。一隻松鼠從最下果子開始向上跳,並且第i次跳可以一次跳過i*i*i除以5的餘數+1個果子(=i*i*i%5+1),並把腳下的果子吃了,如果上面有果子,在重力作用下,都將向下掉下一格。如第1次跳從第一個果子上跳過1*1*1%5+1=2個果子,可跳到第3個果子上,並把第3個果子吃了;第2次從第4個果子上(落在原來第三個果子位置)跳過2*2*2%5+1=4個到第8個果子上,並把第8個吃了;如此...。

當然,總有一次松鼠會跳出這串果子的最前面,設爲每K次,它喫不到任何果子了。這時它回到最下面的果子上,重做它的第K次跳,以求喫到果子。如此,問它喫的第m只果子(即第M跳喫到的果子)的標號是什麼?

格式

輸入格式

一共兩行,分別爲N和m。(1<=m<=n<=200,並且滿足能夠跳到第m次)

輸出格式

一個數,即它喫的第m只果子的標號。

樣例1

樣例輸入1

10
4

樣例輸出1

9

提示

注:喫掉的果子依次爲3,8,5(回到下面重做第3跳),9(回到下面重做第4跳)

下面的圖給出了每一次的運動軌跡,其中右箭頭表示起跳位置,而星號表示被喫掉的果子。

1 2 3 4 5 6 7 8 9 10
>   * >       * >
>       * >         
>               *

#include<iostream>
using namespace std;
int a[11000];
int n,m;
int main()
{
    cin>>n>>m;
    for (int i=1; i<=n; i++)
    {
        a[i]=i;
    }
    int top=n, now=1, l=1;
    while (true )
    {
        int x=(l*l*l)%5+1;
        now+=x;
        if (now>top)
        {
            now=1;
            now+=x;
        }
        if (l==m)
        {
            cout<<a[now]<<endl;
            break;
        }
        for (int i=now+1; i<=top-1; i++)
        {
            a[i-1]=a[i];
        }
        top--;
        l++;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章