1. 程式人生 > >zcmu-1862 zbj的狼人殺(約瑟夫迴環變形)

zcmu-1862 zbj的狼人殺(約瑟夫迴環變形)

Problem I: zbj的狼人殺

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 140  Solved: 44 [Submit][Status][Web Board]

Description

這天zbj和小夥伴總共n個人出去玩狼人殺,玩的正開心的時候又來了一群人總共n個,硬是要跟他們一起玩,所以他們想了一個遊戲規則準備趕走他們。規則是這樣的,所有人坐在圓桌旁,從第一個人開始報數,數到第m個人,則這個人出局;然後從出局的人之後開始數數,再將數到的第m個人出局.....依次方法不斷出局,直到最後只剩n個人,這時候,zbj希望剩下的n個人是他和他的小夥伴們,試問預先應該怎麼安排座位,能使得他完成心願?

Input

多組資料,每組資料輸入:人數n(<=100000)、步長m(<=32767);

Output

對於每一組資料,輸出2n個大寫字母,‘A’表示zbj和他的小夥伴,‘B’表示外來的那群人,50個字母為一行,不允許出現空白字元。相鄰資料間留有一空行。

Sample Input

2 3 2 4

Sample Output

ABBA BAAB

也就是約瑟夫迴環多了一個限制條件,原來的是要出列直到剩下1個人,現在要出列直到剩下n個人時就停止出列,並且儲存之前出列的人的位置編號,然後字串相應輸出A/B,

#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cstring>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn = 1e5 + 5;
vector<int> a;
int b[maxn * 2];//注意要開兩倍
int main()
{
    int n,m,x,t = 0;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        if(t != 0)  cout<<endl;
        t = 1;
        a.clear();
        mem(b);
        x = 0;
        go(i,1,2*n) a.push_back(i);
        go(i,0,n-1)
        {
            x = (x + m - 1) % a.size();
            b[a[x]] = 1;
            a.erase(a.begin() + x);
        }
        go(i,1,2*n)
        {
            if(b[i] == 1)   cout<<"B";
            else    cout<<"A";
            if(i % 50 == 0) cout<<endl;
        }
        cout<<endl;
    }
    
    return 0;
}