對於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...