洛谷P1145 约瑟夫 数学

洛谷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 }
原文地址:https://www.cnblogs.com/third2333/p/6954026.html