自然数系列では、1 回目のパスで 2 つおきの要素を削除する必要があります。次に、残りの要素で、2 番目のパスで 3 つおきの要素を削除します。次に、K 番目のパスで、残りの要素から (k+1) 番目の要素をすべて削除します。
シリーズはこうなる
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, ...
1回目のパスの後(2つおきの要素を削除した後)、
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, ...
2 回目のパスの後 (3 番目の要素をすべて削除した後)、
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, ...
3 回目のパスの後 (4 つごとの要素を削除した後)、
1, 3, 13, 15, 19, 25, 27, ...
したがって、無限パスの後、次のようになります
1, 3, 7, 13, 19, 27, 39, 49, 63, 79, ...
このシリーズはFlavius-Josephus sieveとも呼ばれます。
これに対する解決策は、シリーズの 6 番目の要素を見つけることです。
- 6^2 = 36 を行います
- 35 を与える 5 の倍数に下がる
- それから 4 の倍数 = 32 まで
- それから 3 の倍数 = 30 まで
- 次に 2 の倍数 = 28 まで
- 次に、1 = 27 の倍数まで
- したがって、6 番目のラッキー ナンバーは 27 です。
それは機能しますが、ソリューションがどのように機能するのか理解できませんか?
このためのACプログラムは、
int calc(int n)
{
if (n == 1) return 1;
return calc_rec(n*n, n-1);
}
int calc_rec(int nu, int level)
{
int tmp;
if (level == 1) return (nu-1);
tmp = nu % level;
return calc_rec(nu - (tmp ? tmp : level), level-1);
}
これを説明するリンクhttp://oeis.org/A000960