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