NOIP提高組2014 解方程

2022-05-27 19:00:14 字數 1660 閱讀 4943

【題面】:

解方程【思路】:

首先你會發現資料非常毒瘤,\(a[i]<=10^\),最開始以為要寫高精度,等了要完模板之後(沒錯我這麼辣雞怎麼會高精),才發現,根本用不著23333

因為其\(n\)比較小,可以考慮\(hash\)的思想,把\(a[i]\)都\(\%\)乙個大質數,就避免了高精度,具體實現就是在讀入的時候:

inline ll read()

while(c>='0' && c<='9')

return (f*x)%mod;

}

然後考慮題目,\(m<=1e6\),\(n<=100\),感覺好像可以直接列舉,對於\([1,m]\)的整數都\(check\)一遍,找出符合的答案。

但這樣肯定超時,應為對於乙個次數為\(n\)的多項式,求解時需要\(\frac\)次乘法和\(n\)次加法,複雜度就變為了\(o(nm+\frac)\),無法承受,這個時候考慮秦九韶演算法。

秦九韶演算法:對於乙個多項式\(a_nx^n+a_x^+...+a_0\),可以進行如下化簡:

\(a_nx^n+a_x^+...+a_0\)

\(=(a_nx^+a_x^+...+a_2x+a_1)x+a_0\)

\(=((a_nx^+a_x^+...+a_3x+a_2)x+a_1)x+a_0\)

\(.\)

\(.\)

\(.\)

\(=(...((a_nx+a_x+a_x+...+a_1)x+a_0\)

則求解乙個多項式的值,首先計算最內層括號內一次多項式的值,即:

\(v_0=a_n\)

\(v_1=a_nx+a_\)

然後由內向外逐層計算一次多項式的值,即

\(v_2=v_1x+a_\)

\(v_3=v_2x+a_\)

\(.\)

\(.\)

\(.\)

\(v_n=v_x+a_0\)

這樣,求\(n\)次多項式\(f(x)\)的值就轉化為求\(n\)個一次多項式的值。

結論:對於乙個\(n\)次多項式,至多做\(n\)次乘法和\(n\)次加法。

搬運from度娘

然後複雜度就被成功地優化到了\(o(nm)\),雖然理論上還是過不了,但這樣做也是正確並可以\(ac\)

#include#includeusing namespace std;

typedef long long ll;

const int mod=1000000007;

inline ll read()

while(c>='0' && c<='9')

return (f*x)%mod;

}const int maxm = 1e6;

const int maxn = 105;

ll a[maxn];ll ans[maxm];int num = 0;int n,m;

inline bool check(ll x)

return v == 0;

}int main()

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

} printf("%d\n",num);

for(int i=1;i<=num;++i) printf("%d\n",ans[i]);

return 0;

}

NOIp提高組2014 解方程

求方程 sum a ix i 0 在 1,m 內的整數解 1 leq a i leq 10 a i neq 0,1 leq n leq 100,1 leq m 10 6 最樸素的做法就是嘗試所有解,判斷左邊多項式值是否為零 但還有乙個高精問題 如果你真要用高精我也不攔你 可以考慮一種類雜湊做法,如果...

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 我們考慮用秦...