约瑟夫问题模板

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<cstring>
 5 #include<cstdio>
 6 using namespace std;
 7 #define mem(s,n) memset(s,n,sizeof s);
 8 #define ios {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); }
 9 typedef long long ll;
10 const int maxn=5e6+1;
11 const int Inf=0x7f7f7f7f;
12 ll n,k;
13 ll Josephus(ll n,ll k){
14     if(n==1)    return 0;
15     else if(n<k){
16         ll ans=0;
17         for(int i=2;i<=n;i++)
18             ans=(ans+k)%i;
19         return ans;
20     }
21     ll ans=Josephus(n-n/k,k);
22     if(ans<n%k)    ans=ans-n%k+n;
23     else    ans=ans-n%k+(ans-n%k)/(k-1);
24     return ans; 
25 }
26 
27 int main()
28 {   
29     int t;
30     scanf("%d",&t);
31     while(t--)
32     {
33         scanf("%lld%lld",&n,&k);
34         // 简便写法;
35         ll i=1,ans=0,p;
36         while(i<n)
37         {
38             p=(i-ans)/(k-1)+((i-ans)%(k-1)!=0);
39             if(i+p>n) p=n-i;
40             ans+=p*k;
41             i+=p;
42             ans%=i;
43         }
44         // 
45         cout<<Josephus(n,k)<<endl;
46     }
47     return 0;
48 }

 

posted @ 2020-08-08 14:11  JamZF  阅读(119)  评论(0编辑  收藏  举报