noip 解方程 秦九韶演算法

2021-07-15 10:06:04 字數 2152 閱讀 8659

已知多項式方程: a0

+a1x

1+a2

x2……

+an−

1xn−

1+an

xn=0

求這個方程在[1, m]內的整數解(n 和 m 均為正整數)。

輸入共 n+2 行。

第一行包含 2 個整數 n、m,每兩個整數之間用乙個空格隔開。

接下來的 n+1 行每行包含乙個整數,依次為a0

,a1,

a2,.

..,a

n 。

第一行輸出方程在[1, m]內的整數解的個數。

接下來每行乙個整數,按照從小到大的順序依次輸出方程在[1, m]內的乙個整數解。

樣例輸入1

2 10

1 -2

1樣例輸出11 1

樣例輸入2

2 10

2 -3

1樣例輸出2

2 1

2樣例輸入3

2 10

1 3

2樣例輸出3對於 30%的資料,0 < n ≤ 2, |ai

| ≤ 100,anan ≠ 0, m ≤ 100;

對於 50%的資料,0 < n ≤ 100,|ai

| ≤

10100

,an≠ 0,m ≤ 100;

對於 70%的資料,0 < n ≤ 100,|ai

| ≤

1010000

,an≠ 0,m ≤ 10000;

對於 100%的資料,0 < n ≤ 100,|ai

| ≤

1010000

,an≠ 0,m ≤ 1000000。

noip2014 提高組 day2

這個題一看很嚇人,

1010000

?!多大乙個數啊,高精度?肯定超時.

怎麼做?

先是一定要用秦九韶演算法,不然寫起來不僅慢還很辛苦。f(

x)=a

0+a1

x1+a

2x2…

…+an

−1xn

−1+a

nxn=

a0+x

(a1+

x(a2

+x(a

3+……

x(an

−1+x

an))

…)這樣處理以後,列舉x,從內向外算就可以在o(n)驗證方程,而且寫起來也輕鬆

但是數字很大,高精度不可能

寫不來set的我,天天暴力雜湊,這讓我直接就想到可以都同餘方程,兩邊各模乙個質數,若原方程計算結果為0,模了以後也為0,然後多取幾個質數可以避免衝突。過了70%,t了30%。

也就是說還要優化。

都想到了同餘方程那自然就可以想到後面的這個了:f(

x)≡f

(x+p

)(mo

dp)

這樣我們就只用算1~p而不是1~m了,p取3~5個2萬左右的質數就可以避免衝突了。

**見下,很簡單,就沒有寫注釋了。

#include

#include

#include

#define ll long long

using namespace std;

ll a[4][105],x,m,n,k,b[4][1000005],p[4]=;

int main()

if(flag)

}for(int k=1;k<=3;k++)

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

int num=0;

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

if(b[0][i])num++;

cout<'\n';

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

if(b[0][i])printf("%d\n",i);

return

0;}

秦九韶 強枚 NOIP2014day2 解方程

題目描述 已知多項式方程 a0 a1x a2x 2 anx n 0 求這個方程在 1,m 內的整數解 n 和m 均為正整數 輸入輸出格式 輸入共n 2 行。第一行包含2 個整數n m 每兩個整數之間用乙個空格隔開。接下來的n 1 行每行包含乙個整數,依次為a0,a1,a2.an 輸出格式 第一行輸出...

noip2014 解方程 hash 秦九昭

坑啊 選了好幾次質數,發現還是這一組靠譜 思路 每次mod之後求出所有解,再mod再求,看著複雜度差不多了就把沒重複的都輸出就行了 const mi array 1.7 of int64 12537,15437,17647,14677,10003,10009,10007 var n,m,shi,su...

秦九韶演算法實現

設定多項式的係數,為1.0 10.0之間的隨機數 param num return public arraylistgetrandomcoefficient integer num return arraylist 秦九韶演算法計算結果 param arraylist param x return ...