poj 1012 約瑟夫置換

2021-07-06 11:18:25 字數 1044 閱讀 7326

一開始用的不是約瑟夫置換:

關鍵是要儲存之前求出的值。

因為只有13個數,所以也可以另開程式手動求出所有k值塞進陣列,這樣每次查詢都是o(1),0ms了

首先m值必須在[k+1+2kn,2k(n+1)],n=0,1,2……之間,然後

列舉。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;  

#define lch(i) ((i)<<1)

#define rch(i) ((i)<<1|1)

#define sqr(i) ((i)*(i))

#define pii pair#define mp make_pair

#define for(i,b,e) for(int i=b;i<=e;i++)

#define fore(i,b,e) for(int i=b;i>=e;i--)

#define ms(a) memset(a,0,sizeof(a))

const int maxnum =21252;

const int mod = 10007;

int n;

int ssum,st;

////#define _debug_ 1

int k[14];

int oh()

return 0;

}

約瑟夫置換:

1、當前輪共有n人,那麼將殺掉(m-1)%n+1人

2、假設這一輪殺掉的人為ans[i],那麼下一輪從ans[i]+1 開始=1

4、由1得下一輪將殺掉第(m-1)%(n-1)+1;

5、那麼下一輪殺掉的人在本輪的位置是ans[i+1]=((m-1)%(n-1)+1+ans[i]-1)%(n-1)+1=(ans[i]+m-2)%(n-1)+1,如果落到[1,k]裡則m不適合

6、假設第0輪有n+1個人,殺掉第0個。

7、優化,m應從k+1開始

POJ 1012 約瑟夫問題

我是直接模擬的,因為實在想不到什麼好辦法,不過看到0 俗話說得好,不管黑貓白貓,抓到老鼠的就是好貓。於是在自家電腦模擬,打個表,就ac了。至於還有沒有其他方法,有待研究,大家有什麼好方法,請賜教,謝謝!1 模擬 方法是,m從2開始判斷,在1,2,3,2k中,每次找到第m個數,判斷如果是大於k的,那麼...

POJ 1012 約瑟夫環

poj的約瑟夫環問題是原本約瑟夫環的一種變形。約瑟夫環 有n個人,從第乙個人開始報數,數到第m個人就退出,依次迴圈,最後剩下的人為勝利者。可以用迴圈鍊錶和陣列的方法做,當m,n比較小時可以一試 迴圈鍊錶,數到就刪除,數到只剩乙個就輸出 陣列,第0個位置數值置為n,其他照常 a 1 1,a 2 2.數...

POJ 1012 約瑟夫問題

功能function description 約瑟夫環 列舉 poj 1012 開發環境environment dev c 4.9.9.1 技術特點technique 版本version 作者author 可笑痴狂 日期date 20120731 備註notes 大致題意 有k個壞人k個好人坐成一圈...