一開始用的不是約瑟夫置換:
關鍵是要儲存之前求出的值。
因為只有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個好人坐成一圈...