1. 程式人生 > >分數化小數 計蒜客(無限迴圈小數 迴圈節 尤拉函式 尤拉定理 十進位制)

分數化小數 計蒜客(無限迴圈小數 迴圈節 尤拉函式 尤拉定理 十進位制)

原題連結

分數化小數

題目描述

對於一個分數(不一定是最簡形式),給出它的小數形式,如果小數有迴圈節的話,把迴圈節放在一對圓括號中.
例如,1/4 =0.25,1/3=0.3333寫成0.(3)1/7= 0.142857142857...寫成0.(142857)。如果結果是一種整數xxx,則用xxx.0 等表示整數xxx
輸入包括一行,包括被空格分隔開的分子N和分母D(第一個是N,第二個是D)。
輸出包括一行,為轉換後的小數形式。

輸入樣例

45 56

輸出樣例

0.803(571428)

題目解釋

題目中需要求一個 分數 的小數,如果是無限迴圈小數,則輸出 0.xxx(xxx) 的格式。
因此我們考慮,先求出這個小數的 迴圈起始點(S)

迴圈長度(T)

我們舉個栗子。對於 x=4556x = \frac{45}{56} 這種情況。
我們考慮先對 x10x * 10 即: 4556,45056,450056,4500056\frac{45}{56},\frac{450}{56},\frac{4500}{56},\frac{45000}{56}\cdots
然後我們將這些分數的分子進行 mod56mod\ 56 操作, 即:4556,256,2056,3256,4056,856,2456,1656,4856,3256,4056\frac{45}{56},\frac{2}{56},\frac{20}{56},\frac{32}{56},\frac{40}{56},\frac{8}{56},\frac{24}{56},\frac{16}{56},\frac{48}{56},\frac{32}{56},\frac{40}{56}\cdots


我們可以明顯的發現當操作進行到第 10 次的時候和第 4 次重複了,顯然已經形成了一個長度為 6 的迴圈節,即從第 4 項開始迴圈。

由此我們可以推廣到更一般的情況。假設分數為 pq\frac{p}{q} ,由於小數部分和整數無關,因此我們可以假設這個分數為真分數。不妨假設p<qp<q

由上可知,我們可以把第 k+1k + 1 個分數寫成p10kmodqq\frac{p*10^k\ mod\ q}{q}


因此我們可以假設第 ii 個分數和第 jj 個分數相等,即構成了一個迴圈節。有p10i1modqq=p10j1modqq\frac{p*10^{i-1}\ mod\ q}{q} = \frac{p*10^{j -1}\ mod\ q}{q}
兩邊同乘 1010 ,得p10imodqq=p10jmodqq\frac{p*10^i\ mod\ q}{q} = \frac{p*10^j\ mod\ q}{q}
p10jp10i(modq)(i<j)p * 10^j ≡ p * 10^i (mod \ q) \quad (i < j)
又可表示為p10j=p10i+qkp*10^j = p*10^i + q*k
g=gcd(p,q)g = gcd(p,q),設p=pg,q=qgp = p'*g,q=q'*g。即p10jp10i=qkp' *10^j - p'*10^i=q'*k
p(10j10i)=qkp10i(10ji1)=qkp'(10^j-10^i) = q'*k \ →\ p'*10^i(10^{j - i} - 1) = q'k
由此可知q10i(10ji1)pq'|10^i(10^{j - i} - 1)p'
因為 pp'qq' 互質,因此可得q10i(10ji1)q'|10^i(10^{j - i} - 1)
由於 10i10^i 為偶數,且 (10ji1)(10^{j - i} - 1) 為奇數。
顯然 ii10i10^iqq' 共同決定,又知 10i10^iqq' 的公因數由 2255 貢獻。
因此 i=max(n,m)i = max(n,m)nnqq'中貢獻的 22 的個數, mmqq'中貢獻的 55 的個數。

接下來需要求迴圈節 T=jiT = j - i

q=q2n5mq'' = \frac{q'}{2^n*5^m}
經過一番計算,上式 q10i(10ji1)q'|10^i(10^{j - i} - 1) 已經變成了q2n5m(10ji1)10i2n5mq'|2^n5^m(10^{j - i} - 1)*\frac{10^i}{2^n5^m}
q(10ji1)10i2n5mq''|(10^{j - i} - 1)*\frac{10^i}{2^n5^m}