NOIP2014提高組 解方程

2022-05-03 19:18:09 字數 1259 閱讀 2271

題目傳送門: (習慣性放洛谷的鏈結)

這一題看起來資料範圍巨大無比,需要使用各種玄學方法,看了題解後整個人懵逼了....

對於30%的資料,$0

該資料範圍直接高精度,在$[1,m]$的範圍內暴力列舉即可。時間複雜度為$o(n*m*len^)$,其中$len$表示高精度計算過程中數字的位數。

對於50%的資料:$0

我們考慮用秦九昭演算法對計算進行加速,秦九昭演算法思路如圖:

該演算法目的為在求一元$n$次多項式的值時,將求值需要經過$n^$次乘法和$n$次加法降低至$n$次乘法和$n$次加法。

通過此方法化簡,時間複雜度被降低乙個$len$。即可拿到50分。

對於100%的資料:$0

我們考慮將高精度的過程去掉。

考慮到同餘的某些性質,我們可以對方程的兩邊對$p$取模($p$為質數),若x滿足$(\sum _^n a_x^i) =0$,則其必然滿足$\sum _^n a_x^i$ ≡ 0 (mod p)。

根據同餘性質,可將其進一步化簡為$\sum _^n (a_x^i \mod p ) \equiv  0 (\mod p)$,借助該方法,在列舉x值的過程中便不需要使用高精度計算了。

如果逆著推上面的式子,會發現存在有x,使得$\sum _^n (a_x^i \mod p ) \equiv  0 (\mod p)$,但$(\sum _^n a_x^i) \neq 0$。為了避免推出不可行解,首先$p$盡可能地取大,其次是多選幾個$p$分別進行取模,降低通過逆定理求出錯誤的$x$的概率(我比較懶只對乙個大質數取模,結果過掉了)

1 #include2

#define m 2000000

3#define mod 100000007

4#define l long long

5using

namespace

std;

6l rd()

12 l a[m]=,n,m,p[m]=,ans=0;13

bool check(int

x)19

intmain()

25 printf("

%d\n

",ans);

26for(int i=1;i<=m;i++) if

(p[i])

27 printf("

%d\n

",i);

28 }

NOIP2014提高組 解方程

noip2014 提高組 day2 試題。已知多項式方程 a0 a1 x a2 x2 an xn 0 求這個方程在 1,m 內的整數解 n 和 m 均為正整數 輸入共 n 2 行。第一行包含 2 個整數 n m,每兩個整數之間用乙個空格隔開。接下來的 n 1 行每行包含乙個整數,依次為 a0,a1,...

NOIp2014提高組 解方程

思路 係數的範圍有 10 但是用高精度做顯然不現實,因此可以考慮乙個類似於 雜湊 的做法,對方程兩邊同時取模,如果取的模數足夠多,正確率就很高了。中間對多項式的計算可以使用 o n 的秦九韶演算法。然而,我的模數試了很多種都不能a,看了題解發現只要對 1000000007 乙個數取模就ac了?1 i...

NOIP2014提高組 解方程

對於30 的資料,n 2,暴力帶入試解。對於50 的資料,ai很大,結合高精乘法和霍納演算法暴力代入試解。高精乘法,時間複雜度是很恐怖的而且我不懂寫。注意到雖然ai很大,但是m還是在int範圍內的。繼續考慮暴力試解。考慮到0 mod k 0 k n 那麼當f x 0時,f x mod k 0。但是反...