POJ Problem 3931 Classmates題解

類似於約瑟夫環問題,輸入Mike的編號m和在環中剩餘的人數k(包含Mike),求解Mike最少有多少名同學。


#include<iostream>
using namespace std;
typedef long long LL;
LL joseph(LL m, LL k){
    if(m == 1) return 2*k-1;
    else if(m%2 == 0){
        LL n = m/2-1+k;
        if(n >= m) return n;
        else return 0;
    }
    else{
        LL n1 = joseph((m+1)/2, k)*2;
        LL n2 = joseph((m-1)/2, k)*2+1;
        if(n2 == 1) n2 = 0;
        if(n1 > 0 && n2 > 0)
            return min(n1, n2);
        else
            return max(n1, n2);
    }
}

int main(){
    LL m, k;
    while(cin >> m >> k){
        if(m == 0 && k == 0) break;
        LL ans = joseph(m, k);
        if(ans > 0)
            cout << ans << endl;
        else
            cout << "Impossible" << endl;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章