1. 程式人生 > >理科男【數論】

理科男【數論】

題目大意:

對求分數AB,求其在K進位制下是有限小數還是迴圈小數。如果是有限小數,求小數點後的位數;如果是迴圈小數,則求混迴圈部分和迴圈節的長度又分別是多少。
Input

3
1 8 10
17 99 10
217 990 10

Ouput

3 0
0 2
1 2

思路:

這道數論,好難啊。。。
證明我肯定是看不懂了。只能按照題解所說的打,但是什麼都不懂。
在這裡把 題解 的證明放一下。

首先把AB約分成既約分數。設 a[1]=Ar[n] 為原分數小數點後第n位的數。
顯然有

r[1]=floor(K×a[1]B)
剩下來的餘數 a[2]=K×a[1] mod B
依此類推我們有 r[n]=floor(K×a[n]B)a[n]=K×a[n1] mod B
不難發現如果 a[p]=a[q]p<q,那麼小數點後第 p 位到第 q1 位這一段就可以視為一
個迴圈節。
暴力計算數列 a,找到第一個與前面重複的項,就可以找到最短迴圈節了。
這個重複的項前面的部分匯出混迴圈部分。
如果最早在
p
處計算到 a[p]=0,那麼原分數就是一個小數點後有 p1 位的有限小數。
以上便是 50 分的解法。

50分解法還很容易理解,但是接下來的100分做法就真的很難理解了。。。(也許是我太菜了吧)

下面我們對 a 數列的性質做一些討論。
如果 gcd(B,K)=1,對於任意的 i 都有 gcd(a[i],B)=1
KK mod B 時的乘法逆元,即 KK mod B=1。由乘法逆元的性質 K 存在且唯一。
假設最早出現重複的位置是

a[p]=a[q](p<q)
如果 p1,那麼 a[p1]=K×a[p] mod