洛谷P1145 约瑟夫 数学
在做这题之前最好先做一下普通的约瑟夫问题
普通的约瑟夫问题 有一种递推的做法,比如说 12345 五个数,删掉3 之后,那你就把4编号改成3 5改成4,然后继续做就行了,但是后来这样求出的编号并不是其真实的编号,而是虚的编号
然后这道题如果前k个一直没被删,那么被删除的编号一定是大于 k 的,
这样做下去一直判断下去就行了,因为要mod 然后重新编号有些麻烦,所以还是坐标还是从0开始方便安全
1 #include<cstdio> 2 using namespace std; 3 int i,find,k,m,begin; 4 int check(int remain) 5 { 6 int result=(begin+m-1)%remain; 7 if(result>=k){//判断出列的那个人 8 begin=result; 9 return 1; 10 } 11 else{return 0;} 12 } 13 int main(){ 14 scanf("%ld",&k); 15 m=k; 16 while(!find) 17 { 18 find=1;begin=0;//设置第一个 19 for(i=0;i<k;i++) 20 { 21 if(!check(2*k-i))//如果判断好,就可以退出了…… 22 { 23 find=0;break; 24 } 25 } 26 m++; 27 } 28 printf("%d",m-1);//多加了一个,减回去 29 return 0; 30 }