【題面】:
解方程【思路】:
首先你會發現資料非常毒瘤,\(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 我們考慮用秦...