Re: [ACM ] 10290 {Sum+=i++} to Reach N

看板C_and_CPP (C/C++)作者 (十三)時間16年前 (2009/05/03 20:38), 編輯推噓6(605)
留言11則, 5人參與, 最新討論串1/1
※ 引述《DJWS (...)》之銘言: : 這一題會用到質因數分解 : 我本想使用 Pollard's rho algorithm : 不過N的範圍實在太大了 (9*10^14) : 運算過程當中無法把數值直接放進一個64bit的整數裡 : 這條路不知可不可行... : 想請教各位是什麼方式通過這題的? 唉 這題我的程式只能剛好通過ACM UVa上的測資 只能說測資不夠刁鑽 如果我將程式修正的話 就會TLE 先講解這題在問什麼 這題要求某個數 他的奇因數有幾個 以30來說 1, 2, 3, 5, 6, 10, 15, 30 所以答案是 4 ( 1, 3, 5, 15 ) 比較快的方法就是求奇質因數指數 + 1後相乘 30 = 2^1 * 3^1 * 5^1 所以答案為 (1 + 1) * (1 + 1) = 4 如果有某個數的質因數分解是 2^3 * 3^2 * 7^1 答案為 ( 2 + 1 ) * ( 1 + 1 ) = 6 質因數2可以完全不管他 所以我們得到題目輸入的n時 先把所有的2除盡 for( ; n > 1 && n % 2 == 0; n /= 2 ); 之後的n開始質因數分解並對奇質因數的指數下功夫 如果還在 for(k = 3; k <= n; k += 2) 一定是TLE 我們的k一次跳一定是跳質數 所以又回到求質數的老問題 不管用任何方法總之要先求出一群質數並放入陣列 range到9E14 所以理論上要求到3E7的質數才準 而我賭測資不會超過10E6的質數 所以我把range下修到10E6 如此才AC的 AC秒數是2.150 也差點TLE了 如果我要修正程式到3E7的話 還是TLE 大致上是這樣 至於質因式分解這個大家都很熟才對 附帶一提 PKU OJ 2140 和這一題一模一樣 但他的測資只到10E7 可以輕鬆巴假的 短碼達人這本書有提到 不過該書裡面的code對這題來說只是code短而已 速度上還是很慢的 Pollard's rho algorithm 這個演算法的缺點在於如果數是composite的話 也就是這個數是好幾個質數的乘積 就要花很多時間去換 c 來run這個演算法 我用大數實作這個演算法上傳 還是TLE Bleed -- World of bleed1979 http://bleed1979.myweb.hinet.net/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.133.230

05/03 21:00, , 1F
題目是問這個嗎? 怎麼跟我看到的不一樣?
05/03 21:00, 1F

05/03 21:03, , 2F
這個在討論區有人貼了一個連結,說明題目可以轉化為原 PO
05/03 21:03, 2F

05/03 21:03, , 3F
05/03 21:03, 3F

05/03 21:25, , 4F
質數不超過1e6的假設真是太邪惡了XDD
05/03 21:25, 4F

05/03 21:26, , 5F
準確來說 應該是沒有2個超過10E6的質因數相乘
05/03 21:26, 5F

05/03 21:26, , 6F
因為除不盡的數都把他當做質數了
05/03 21:26, 6F

05/03 21:28, , 7F
我看rank list有滿多人都是一秒之內通過的 應該有更妙的方法
05/03 21:28, 7F

05/03 21:29, , 8F
討論區有一篇說有三個結果,然後說不要再寫信問他了XD
05/03 21:29, 8F

05/03 21:44, , 9F
剛剛試了一下 找1e6以內所有奇質數,用篩的 0.5秒過
05/03 21:44, 9F

05/03 21:44, , 10F
05/03 21:44, 10F

05/03 23:42, , 11F
感謝樓上...難道大家都是這樣AC的? XD
05/03 23:42, 11F
文章代碼(AID): #19_P15oq (C_and_CPP)
文章代碼(AID): #19_P15oq (C_and_CPP)