SDNUOJ1208.玉玉抓兔子

	Description
	 围绕着山顶有n个圆形排列的洞,玉玉要吃兔子,兔子说:“可以,但必须找到我,我就藏于这1..n个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,以后如此类推,次数不限.”但玉玉从早到晚找了m次,仍没有找到兔子.问:兔子究竟藏在那个洞里?请输出兔子可能存在的洞号。若兔子无处可藏,输出-1。
    
    
        Input
    
    
        两个数n(0<=n<=10^4),m(0<=m<=10^6)
    
    
        Output
    
    
        兔子可能存在的洞号,按字典序输出,两个洞之间用空格分隔
    
    
        Sample Input
    
    
        10 1000
    
    
        Sample Output


        2 4 7 9

一开始写的memset(b,1,sizeof(b));是错的,没有结果,后来改成了0.现在记住了!

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int b[10000+5];
int main()
{
   
    int n,m,f,i,j,k;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
   
        memset(b,0,sizeof(b));
        j=1;k=1;
        for(i=1; i<=m; i++)
        {
   
            if(i==1)
                b[i]=1;
            else
            {
   
                j++;
                if(k+j>n)
                {
   
                    k=(k+j-1)%n+1;
                    b[k]=1;
                }
                else
                {
   
                    k+=j;
                    b[k]=1;
                }
            }
        }
        f=0;
        for(i=1; i<=n; i++)
        {
   
            if(b[i]==0)
            {
   
                f=1;
                cout<<i;
                break;
            }
        }
        if(f)
        {
   
            for(i=i+1; i<=n; i++)
            {
   
                if(b[i]==0)
                    cout<<" "<<i;
            }
            cout<<'\n';
        }
        else
            cout<<"-1"<<'\n';
    }
    return 0;
}