洛谷 P2069 松鼠吃果子

题目描述

有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: 复制
10 
4
输出样例#1: 复制
9

说明

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

思路:模拟

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,pos;
int num[201];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)    num[i]=i;
    pos=1;
    for(int i=1;i<=m;i++){
        int x=i*i*i%5+1;
        pos+=x;
        if(pos>n)    pos=1+x;
        if(i==m)    break;
        for(int j=pos;j<n;j++)    num[j]=num[j+1];
        n--;
    }
    cout<<num[pos];
}

 

posted @ 2017-11-19 17:26  一蓑烟雨任生平  阅读(286)  评论(0编辑  收藏  举报