NOIP2014解方程


題目:求一個n次整系數方程在1-m內的整數解  n<=100 系數<=10000位 m<=100W

題解:最暴力的想法是枚舉x,帶入求值看是否為0.

          這樣涉及到高精度乘高精度,高精度乘單精度,高精度加高精度和高精度減高精度。

          復雜度 n*m*len*len ,顯然只能過30%的數據

          讓我們考慮優化:

          我們先來研究一下這個算法的主要耗時在哪里

          1)將x帶入方程左邊求值

          2)選擇多少x帶入

         我們考慮第一個優化

          1)秦九韶算法

          只要我們把原方程左邊化為 ((An*x+An-1)*x+An-2)*x+An-3+.....A0

          我們發現這樣就不用寫高精乘高精了。復雜度下降一個len 大概可以得到50分

        第二個優化

         2)去除冗余

          我們發現直接代值是復雜度相當高的,即使用了秦九韶算法復雜度也是 n*len,1s的時限僅供我們嘗試100個x是否為該方程的解。

          讓我們先篩去顯然不可能是方程的解的數。

          我們發現0的一個特征就是模任何一個數都是0,但我們多模幾個質數是否能一定保證該數為0呢?當然不行。

          那模誰呢?x。

          顯然,左邊 mod x=A0 mod x ,所以A0 mod x=0

          也就是說x一定是A0的約數!  (搞數競的應該看題就想到了吧233)

          然后我們的算法來了:

          枚舉1-m的每個數i,先判斷它是不是A0的約數,這只要類似於高精除單精掃一遍就行了,如果不是,那么顯然 2*i,3*i,……都不會是A0的約數,我們類似篩法篩掉這些

          如果是的話,帶入求值判斷是否為0.

          當然如果A0=0的話,該方程的一個解是0,然后其余的解都滿足 A1+A2*x^1+A3*x^2+……An*x^n-1=0,我們試A1即可。

當然,到這里,算法的復雜度還是不好估計,不過是不可能達到n*m*len的上界的,應該有很大一部分被剪掉了。

如果還需要優化的話,壓4位是個不錯的選擇。

當然,我在考場上並沒有想到第二個優化。但我確實想到了mod x,但忽略了 A0這一項,認為顯然左邊 mod x=0,然后。。。這也是本次noip最大的一個遺憾吧。

當然,上述只是我考后的一個想法,能不能拿到滿分我也不清楚。

如果神犇們發現還有什么可以優化的方法或者其它更好的方法,請指出,謝謝。

 UPD:TAT 為何看到有人說只模一個質數就能100了。。。我是sb?想了這么多。。。知道真相的我眼淚掉下來。。。

 UPD:發現我果真是sb,100W內的素數大約有7W+,然后。。。請大家無視上面的話吧T_T(貌似壓位可以搞?)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM