在留資格認定書交付申請の情報
- 法務局 在留資格認定証明書交付申請(日本人の配偶者)
関連する法律
- 出入国管理及び難民認定法施行規則の第六条あたり
- 申請できる人
- 在留したい人本人
- 在留したい人の親族(上記の法律の「別表第四(第六条の二関係)」)
- 1. 六親等以内の血族
- 2. 配偶者
- 3. 三親等以内の姻族
ノードがn個の二分探索木の個数
1,2,...,nをノードに持つ二分探索木が何通りできるか考える.
n = 1のとき二分探索木の個数は1通り
n > 1のとき
根は1,2,...,nまでありうるから
異なるn個の値をノードに持つ二分探索木の個数をf(n)通りとすると
f(1) = 1
f(n) = 根が1の二分探索木の個数 + ... + 根がnの二分探索木の個数
根が1の二分探索木は
- 左の子はない
- 右の子は2,...,nをノードに持つ二分探索木の根がくっつく
根がnの二分探索木は
- 左の子は1,...,n-1をノードに持つ二分探索木の根がくっつく
- 右の子はない
根がr (1 < r < n)の二分探索木は
- 左の子は1,...,r-1をノードに持つ二分探索木の根がくっつく.
- 右の子はr+1,,...,nをノードに持つ二分探索木の根がくっつく.
よって
子がない場合もノードが0個の二分探索木がくっつくと見なしてf(0)=1とすれば
根がrの二分探索木はf(r-1)f(n-r)通りある.
したがって
f(1) = 1
f(n+1) = f(0)f(n)+f(1)f(n-1)+...+f(n)f(0) = Σ[r=0,n] f(r)f(n-r)
この漸化式はカタラン数の漸化式と同じであるから
1,2,...,nをノードに持つ二分探索木の個数は
Project Eulerのメモ
Project Euler 240
{1,...,i}からn個をとった上位t個の和がsになる出方の個数をf(i,n,t,s)とする.
f(12,20,10,70)の値を求めたい.
まず{1}からn個とったうち上位t個の和がtになる出方は1通り, 和がそれ以外になるのは0通り.
{1,...,i}からn個をとった上位t個の和がsになるのは, t個全部がiの場合とt個のうちk個(0<=k<=t-1)がiの場合がある.
t個のうちk個がiになる場合は, 「{1,...,i-1}からn-k個をとった上位t-k個の和がs-ikになる並び」にk個のiをねじ込むとできる.
t個が全部iになる場合はi*t == sの場合しかなくて, 「{1,...,i-1}からn-k個をとった並び」にk個のiをねじ込むとできる.
また, n-k個の並びにk個のiをねじ込む仕方は通りある
よって
i*t == sのとき
i*t != sのとき
高速化のためにメモ化したり, i*t < sのときは必ず0なので打ち切ったりする.
Project Euler 293
10^9未満のadmissible numberのリストを作成して, それぞれに対してpseudo-Fortunate numberを求める.
i番目の素数を含むadmissible numberのリストをf(i)とする. 便宜的にf(1)=[1]とすると
i+1番目の素数をpとして
f(i+1) = f(i-1).map{|n| n*p }+f(i-1).map{|n| n*p^2 }+...+f(i-1).map{|n| n*p^m }
ただし, n*p^m < 10^9 <= n*p^(m+1)
でadmissible numberが求められる.
pseudo-Fortunate numberは素直に素数のリストを引くか, 2ずつ増やして素数判定を行って調べる.
チェビシェフの定理によれば任意の自然数nについてn+1 < p < 2(n+1)を満たす素数pが必ず存在するから
sqrt(2*10^9)までの素数表があれば十分足りる.
Project Euler 315
nの各桁の総和をsum(n)とする. (sum(123) = 1+2+3 = 6)
数nの右からi桁目を とする.
数字dを表示するとき点灯するセグメントの本数をnum_seg(d)とする. ただし, num_seg(_) = 0とする.
数字dを数字eに変更するコスト(dとeの異なるセグメントを消灯,点灯するコスト)をc(d,e)とする.
ただし, c(d,_) = dを消灯するコスト = numseg(d)とする.
サムの方法で, 既にnが表示されている状態から始めて数字根を表示しきるまでのコストをsams(n)とすると
マックスの方法で, 既にnが表示されている状態から始めて数字根を表示しきるまでのコストをmaxs(n)とすると
ただし, Lはnの桁数.
nが1桁のとき, sams(n) = maxs(n) = nを消灯するコスト = numseg(n)
区間ふるいを使ってみた.
Project Euler 329
i回目のジャンプで鳴く鳴き声をs[i]とする.
s=[P,P,P,P,N,N,P,P,P,N,P,P,N,P,N]
s.length==15
位置iにいるカエルがs[j],s[j+1],...,s[14]と鳴く確率をf(i,j)
位置iにいるカエルがs[j]と鳴く確率をp(i,j)
とすると
- f(i,14) = p(i,14)
- j < 14のとき
f(1,j) = p(1,j)f(2,j+1)
f(500,j) = p(500,j)f(499,j+1)
- 1 < j < 500, j < 14のとき
f(i,j) = (1/2)p(i,j)f(i-1,j+1)+(1/2)p(i,j)f(i+1,j+1)
p(i,j)は
(iが素数かつs[j]=P)または(iが素数でないかつs[j]=N)のときp(i,j) = 2/3
それ以外のときp(i,j) = 1/3
Project Euler 345
割当問題なのでglpkで解いてみた.
http://gusek.sourceforge.net/gusek.html:GUSEKのサンプルについていたassign.modを流用できた.
Project Euler 371
3桁の数を合計が1000になるペアに分ける. 500と000だけは特別扱いする.
ペア1: [001,999]
ペア2: [002,998]
ペア3: [003,997]
...
ペア499: [499,501]
500, 000
すると勝ちの条件は
- 500が二回出る
- 既に出ているペアの片割れが出る(例えば, 既に012が出ているときに988が出る)
Q(k,t)を, k個のペアが出て500がt回出ている状態として状態遷移の仕方を考える
Q(k,0)の状態で
- 000が出る →Q(k,0)
- 500が出る →Q(k,1)
- k個のペアの片割れが出る →勝ち
- k個のペアの既に出た番号が出る →Q(k,0)
- 上記の他の番号が出る →Q(k+1,0)
Q(k,1)の状態で
- 000が出る →Q(k,1)
- 500が出る →勝ち
- k個のペアの片割れが出る →勝ち
- k個のペアの既に出た番号が出る →Q(k,1)
- 上記の他の番号が出る →Q(k+1,1)
f(k,t)を, 状態Q(k,t)から始めて勝つまでの期待台数とする.
f(k,t) = 1+P(000が出る)f(k,t)+P(500が出る)f(k,t+1)+P(k個のペアの既に出た番号が出る)f(k,t)+P(それ以外)f(k+1,t)
f(k,2) = 0
f(499,t) = 1+P(000が出る)f(499,t)+P(500が出る)f(499,t+1)+P(499個のペアの既に出た番号が出る)f(499,t)
これをf(499,1)から順に解いていってf(0,0)の値を求める.
f(499,1) = 1/{1-P(000が出る)-P(499個のペアの既に出た番号が出る)}
f(499,0) = {1+P(500が出る)f(499,1)}/{1-P(000が出る)-P(499個のペアの既に出た番号が出る)}
f(k,1) = {1+P(それ以外)f(k+1,t)}/{1-P(000が出る)-P(k個のペアの既に出た番号が出る)}
f(k,0) = {1+P(500が出る)f(k,1)+P(それ以外)f(k+1,0)}/{1-P(000が出る)-P(k個のペアの既に出た番号が出る)}
Project Euler 381
pを5以上の素数とする.
ウィルソンの定理より
p+1は偶数だから, 2^(-1) = (p+1)/2 mod p
p = 1 mod 3のときp=3m+1と表せるから, 3^(-1) = -m = -(p-1)/3
p = 2 mod 3のときp=3m+2と表せるから, 3^(-1) = m+1 = (p+1)/3
Project Euler 387
1〜12桁のright truncatable Harshad numberのリストを作って
そこからstrong Harshad numberであるものだけ取り出して
取り出したリストからstrong, right truncatable Harshad primeを作ればよい.
n桁のright truncatable Harshad numberはn-1桁のものの右端に一桁付け加えて作る.
strong, right truncatable Harshad primeはstrong, right truncatable Harshad numberの右端に一桁の奇数を付け加えて作る.
Project Euler 419
Look and Say Sequenceの性質であるCosmological Theoremを使う.
Conwayによると, Look and Say Sequenceの第8項以降の各項は92種類の基本元素に分割できて
基本元素の変化だけで, 全部の項が生成できる.
http://www.njohnston.ca/2010/10/a-derivation-of-conways-degree-71-look-and-say-polynomial/
例えば
第8項目の1113213211は11132と13211に分割できて, これ24番と39番に対応する.
24番の11132は83番の311312
39番の13211は9番の11131221
にそれぞれ変化して
第9項目の31131211131221 = (83番)(9番)になる.
83番の311312は45番の1321131112
9番の11131221は71番の3113112211
にそれぞれ変化して
第10項目の13211311123113112211=(45番)(71番)になる.
これ以降も同様にして基本元素の変化だけで表せる.
1の個数, 2の個数, 3の個数などは各基本元素の個数さえ分かれば順番は必要ないから
24番は1個の83番に遷移する
39番は1個の9番に遷移する
といった遷移の情報を持つ92行92列の遷移行列Mを作って, を計算すればよい.
ただし, vは第8項の基本元素の個数を表現したベクトルで24番と39番が1個ずつある.
Project Eulerのメモ
Project Euler 151
A1の紙がa1枚, A2の紙がa2枚, ..., A5の紙がa5枚あるときから始めて, 封筒に紙が1枚だけ入っている回数の期待値を
として漸化式を立てて, を求める.
例えば紙の枚数がの日にA3の紙を手にとったら, 次の日の紙の枚数はになる.
Project Euler 158
左隣の文字より辞書順で後になる文字がちょうど1個
⇔
a,b,...,zを0,1,...,25に置き換えたとき
左隣の数より大きい数がちょうど1個
⇔
が成り立つこと
つまり
- 0,1,2,...,25からn個をとって
- になるように2グループに分ける
仕方の数を数える.
高校の場合の数の問題に出てきそう.
Project Euler 169
2^0, ..., 2^kを2個ずつまで使ってsを作る組み合わせの個数をとして漸化式を立てて計算する.
Project Euler 225
法mのもとでトリボナッチ数は循環するから循環するまで0が出てこない奇数を小さい順に列挙する.
Project Euler 239
包除原理. ちょうど3つの素数だけが正しい位置にある並びの個数を数える.
Project Euler 323
ガチャをコンプリートする回数の期待値の問題と同じ
nビットが立っている状態からスタートして32ビット全て立つまでのステップ数の期待値をE(n)とする.
漸化式を立てて, E(0)を求める.
Project Euler 435
を閉じた式で表して, の間の漸化式を立てて計算する.
コンパニオン行列を使って計算.
組み合わせの個数を数える質問(yahoo知恵袋)
元の質問は, a,b,c,d,e,fの6文字から重複を許してn個選び,
選んだn個をそれぞれ2倍に複製した2n個を並べる並べ方の個数を求めたいとのこと.
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12151668017
例えば, n=3で最初に「aが1個とbが2個 (a,b,b)」が選ばれたら,
並べるときはそれぞれ2倍に複製してa,a,b,b,b,bを一列に並べる.
結論から書くと, n個選ぶときの並べ方の個数は
で求められる.
漸化式を立てて泥臭く求めたけれど, 以外に綺麗な形なので, エレガントな求め方がありそう.
数列A[i] = {a,b,c,d,e,f}として
A[1]=a,...,A[6]=fを表すとする.
f(n,k)でA[1],...,A[k]のk文字から重複を許してn個選んだときの並べ方の個数を表す.
つまり, f(n,6)の一般項を求めたい.
f(n,1) = 1
f(1,k) = k
はすぐ分かる.
また, A[1],...,A[k],A[k+1]のk+1文字から重複を許してn個選んだときの並べ方は
(1) n文字全部A[k+1]を選んだときの並び
(2) A[1],..,A[k]からm個選んでA[k+1]を(n-m)個選んだときの並び
(ただし, m=1,2,...,n)
に分けられる.
A[1],..,A[k]からm個選んでA[k+1]を(n-m)個選んだときの並びは
f(m,k)で数えた長さ2mの並びのそれぞれにA[k+1]を2(n-m)個挿入して作ることができる.
長さ2mの並びに2(n-m)個挿入する場合の数は通りあるから
(1)の並びは1個
(2)の並びは各mに対して, 個ずつある
よって並びの個数を求める漸化式は
となる
以下, ひたすらに一般項を計算する
とすると,
より
と表せる.
最後の式を整理して最初に書いた一般項が得られる.
次のf(n,7)は
(1/32)(S(6)+6S(4)+15S(2)+ 定数)という形だろうし, うまい規則がありそう.
ProjectEuler 162
包除原理の例題みたいな問題。
先頭から続く0は無視することだけ注意すればよい。
n桁の16進数xの個数は15*16^n個
f(prop) = 条件propを満たすn桁の16進数の個数
とすると
f(0を含む & 1を含む & Aを含む) = 15*16^n - f(0を含まない | 1を含まない | Aを含まない)]
包除原理より
f(0を含まない | 1を含まない | Aを含まない)=f(0を含まない)+f(1を含まない)+f(Aを含まない)
-f(0を含まない & 1を含まない)-f(1を含まない & Aを含まない)-f(Aを含まない & 0を含まない)
+f(0を含まない & 1を含まない & Aを含まない)
それぞれ
f(0を含まない) = 15^n
f(1を含まない) = f(Aを含まない) = 14*15^(n-1)
f(0を含まない & 1を含まない) = f(Aを含まない & 0を含まない) = 14^n
f(1を含まない & Aを含まない) = 13*14^(n-1)
f(0を含まない & 1を含まない & Aを含まない) = 13^n
したがって
f(0を含まない | 1を含まない | Aを含まない) = 15^n+2*14*15^(n-1)-2*14^n-13*14^(n-1)+13^n
f(0を含む & 1を含む & Aを含む) = 15*16^(n-1)-43*15^(n-1)+41*14^(n-1)-13^n