NOIP2014提高組 解方程

2022-06-03 05:09:13 字數 1550 閱讀 2357

對於30%的資料,n<=2,暴力帶入試解。

對於50%的資料,ai很大,結合高精乘法和霍納演算法暴力代入試解。

高精乘法,時間複雜度是很恐怖的而且我不懂寫。

注意到雖然ai很大,但是m還是在int範圍內的。

繼續考慮暴力試解。

考慮到0 mod k=0 (k∈n*),那麼當f(x)=0時,f(x) mod k=0。

但是反過來f(x) mod k=0不一定使f(x)=0成立。當k|f(x)時,f(x) mod k=0也能成立。

為了盡可能避免這種情況,和hash一樣,k取幾個素數,只有膜這幾個素數的時候f(x) mod k=0均成立,才判斷f(x)=0成立。

在本題中

,故

發現ai可以被膜掉,成功迴避高精運算。

實際實現的時候可以寫乙個和快速讀入一樣的東西,一邊讀一邊膜。也可以先以字串的形式讀進來,再計算成膜k的值。

然後發現xi也被膜掉,也就是說f(x) mod k=f(x+k) mod k。因此試解的時候只需要試[1,k)範圍內的解。當然,k要取遠比m小的數,這個優化才有意義。

模幾個素數呢?模多大的素數呢?這是個非常看臉的問題。少了會wa,多了會tle。

經過多次測試,模5個10000左右的素數是墜吼的。可是noip哪有機會多次測試

#include #include 

#include

#include

#include

#define maxn 105

#define maxm 1000005

#define num_of_prime 5typedef

long

long

llint;

using

namespace

std;

const llint prime[num_of_prime] =;

llint a[maxn][num_of_prime];

//a[i][j] => i次項係數 % prime[j]

intn, m;

void geta(int

i) do

while (isdigit(c =getchar()));

if(flag)

}llint get_val(llint x,

int k) //

return f(x) mod k

bool

isroot[maxm];

intmain()

}vector

ans;

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

if(isroot[i])

ans.push_back(i);

cout

<< ans.size() <

for (int i = 0; i < ans.size(); i++)

cout

<< ans[i] <

return0;

}

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提高組 解方程

題目傳送門 習慣性放洛谷的鏈結 這一題看起來資料範圍巨大無比,需要使用各種玄學方法,看了題解後整個人懵逼了.對於30 的資料,0 該資料範圍直接高精度,在 1,m 的範圍內暴力列舉即可。時間複雜度為 o n m len 其中 len 表示高精度計算過程中數字的位數。對於50 的資料 0 我們考慮用秦...

NOIp2014提高組 解方程

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