1. 程式人生 > >【POJ3358】Period of an Infinite Binary Expansion-尤拉定理+數論好題

【POJ3358】Period of an Infinite Binary Expansion-尤拉定理+數論好題

測試地址:Period of an Infinite Binary Expansion
題目大意:對於一個小於1的有理數L,將其寫成二進位制小數形式:0.a1a2...,小數部分無限延伸下去(如果有限就在後面填0)。若這個小數部分可以寫成下列形式:a1a2...ar(ar+1ar+2...ar+s)w,其中(s)w表示字串s重複出現若干次,則稱a1a2...ar為一個長為r的字首,ar+1ar+2...ar+s稱為一個長為s的迴圈。輸入一個有理數p/q(0p<q2109)p,q為整數,請你求這個有理數小數部分的最小迴圈長度,並求出迴圈最早在哪一位開始出現(即最小字首長度+1)。
做法:

可惡啊!明明方程都推出來了,可就是做不出來,好氣啊,沒辦法只能看了題解……
首先我們可以將p/q約分,即令p=p/gcd(p,q),q=q/gcd(p,q),簡化計算而又不影響結果。分析題目,一個有理數小數部分的二進位制表示可以用二進位制轉換法(乘二法)得到,那麼我們可以得到下面這個序列:2i×p/q(i0),將每一個數的分子模q,得到:(2i×pmodq)/q。將幾組資料代入觀察,發現分子出現迴圈,而這個迴圈長度正好相當於二進位制位中的迴圈長度,那麼問題就轉化成了求關於i,j的同餘方程:2i×p2i+j×p(modq)的一組解,使得i,j最小。可以發現ij就是我們說的最小字首長度和最小迴圈長度。
將式子轉換一下變成:(
2j1)×p×2i0(modq)
,也就是說q|(2j1)×p×2i,因為gcd(p,q)=1,所以q|(2j1)×2i,又由於2j1是奇數,所以i就是q中包含的素因子2的數量,原因後面說明。設q=q/2i,則q|2j1,那麼問題轉化成求關於j的同餘方程2j1(modq)的最小正整數解。這時候就表明前面確定i的大小的方法正確的原因了,如果這裡gcd(q,2)1,這個同餘方程就無解了,所以要去掉q的所有因子2來確保方程必然有解。由尤拉定理得2φ(q)1(modq),可以證明最小解j一定是φ(q)的因子。使用反證法證明,假設最小解j不是φ(q)的因子,那麼設r=φ