題目描述
已知多項式方程:
a0+a1x+a2x^2+..+anx^n=0
求這個方程在[1, m ] 內的整數解(n 和m 均為正整數)
輸入輸出格式
輸入共n + 2 行。
第一行包含2 個整數n 、m ,每兩個整數之間用乙個空格隔開。
接下來的n+1 行每行包含乙個整數,依次為a0,a1,a2..an
輸出格式:
第一行輸出方程在[1, m ] 內的整數解的個數。
接下來每行乙個整數,按照從小到大的順序依次輸出方程在[1, m ] 內的乙個整數解。
輸入輸出樣例
輸入樣例#1:
2 10
1 -2
1 輸出樣例#1:
1 1
輸入樣例#2:
2 10
2 -3
1 輸出樣例#2:
2 1
2 輸入樣例#3:
2 10
1 3
2 輸出樣例#3:
0 說明
對於30%的資料:0< n<=2,|ai|<=100,an!=0,m<100
對於50%的資料:0< n<=100,|ai|<=10^100,an!=0,m<100
對於70%的資料:0< n<=100,|ai|<=10^10000,an!=0,m<10000
對於100%的資料:0< n<=100,|ai|<=10^10000,an!=0,m<1000000
我們將公式化簡可得
a0+a1x+a2x^2+..+anx^n
=a0+x(a1+a2x+a3x^3..+anx^(n-1))
=a0+x(a1+x(a2+a3x..+anx^(n-2))
=......
=a0+x(a1+x(a2+x(a3+x(a4.....))
由上的秦九韶公式求得,我們可以在列舉乙個點後o(n)判斷是否為0
那麼反過來看m的範圍m<=1000000,n<=100
咦!又露出了那意味聲稱的邪笑!
然後,這就是題水題了
我們強枚可能的m,用o(n)判斷是否為0
(tips:
由於ai<=10^10000,所以我們必須模乙個大質數
最好多模幾個,以免出現剛好為質數的倍數的點
不過我乙個10^9+7就夠了
)
#include
#include
#include
#include
#include
#include
const
int mo=1000000007;
using
namespace
std;
long
long a[110],n,m,ans[1000100],cnt;
long
long read()
while (c>='0'&&c<='9') sum=sum*10+c-'0',sum%=mo,c=getchar();
return sum*zf;
}long
long f(long
long h)
return sum;
}int main()
noip 解方程 秦九韶演算法
已知多項式方程 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.0 10.0之間的隨機數 param num return public arraylistgetrandomcoefficient integer num return arraylist 秦九韶演算法計算結果 param arraylist param x return ...
秦九韶演算法C語言
最近在學數值分析,需要進行演算法編碼,小小的記錄一下自己的實驗!關於秦九韶演算法求解多項式,開始之前看了很多同學的分享,基本採用的都是陣列儲存係數再進行迴圈。但是直接用c語言陣列靜態儲存感覺不太方便,必須提前約定陣列規模,無法隨著輸入數的改變而變動。所以這裡就換成了動態記憶體分配的方法qwq,採用m...