去年合肥網(wǎng)絡(luò)賽的題目,今天終于給搞定了。確切的說不是完全獨立想出來的,看了網(wǎng)上的一點提示(用歐拉定理),然后想了好幾次終于想出來了。
題目大意是給定一個L(L不大于2000000000),求最小長度的能整除L的都是8的數(shù),輸出長度,如果沒有輸出0。設(shè)長度為n的話,那么這個全為8的數(shù)可以表示成8 + 80 + 800 + ...是一個等比數(shù)列,變換后得到8 * (10 ^ n - 1) / 9 = k * L。如果L中2的因子數(shù)不大于3個,那么可以除掉。之后等式可以寫成10 ^ n - 1 = 9 * k * L,也就可以轉(zhuǎn)換成一個模方程:10 ^ n = 1 mod 9L。根據(jù)歐拉定理,一定要10和9 * L互素才能有解,這樣就可以判定出無解的情況了。之后相當(dāng)于求一個原根,求出9L的歐拉函數(shù),設(shè)其為phi,那么n一定是phi的約數(shù)才可以滿足條件,枚舉phi的約數(shù)就可以了。
這個題目變態(tài)的一個地方在于9L和phi都可能很大,int表示不下,要用long long,這么大的模簡單的乘法會溢出,也要寫成二分的形式。中間有好幾個地方我都用了int,結(jié)果導(dǎo)致溢出,超時了2次。總的來說這是個很好的數(shù)論題目,以后這種題目應(yīng)該多練習(xí)一些。
posted on 2009-06-10 09:16
sdfond 閱讀(323)
評論(0) 編輯 收藏 引用 所屬分類:
Algorithm - Number Theory