題目:求一個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(貌似壓位可以搞?)