描述
有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++;
}
}