1. 程式人生 > 實用技巧 >洛谷 P2312 解方程(數學||秦九昭)

洛谷 P2312 解方程(數學||秦九昭)

題目連結:https://www.luogu.com.cn/problem/P2312

秦九昭演算法模板。

秦九昭演算法:https://baike.baidu.com/item/%E7%A7%A6%E4%B9%9D%E9%9F%B6%E7%AE%97%E6%B3%95/449196?fr=aladdin

將多項式

化成

求多項式的值時,首先計算最內層括號內一次多項式的值,即 $v_1=a_n*x+a_{n-1}$ 然後由內向外逐層計算一次多項式的值,即 這樣,求n次多項式f(x)的值就轉化為求n個一次多項式的值。 結論:對於一個n次多項式,至多做n次乘法和n次加法。

關於這道題:

首先用字串讀入,然後mod一個大質數,使它儲存下來。然後列舉每一個數,如果帶入經過秦九昭演算法處理過的式子中,這個式子為0,那麼就記錄下來。

AC程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 typedef long long ll;
 6 const int mod=998244353;
 7 ll n,m,cnt;
 8 ll a[110];
 9 ll ans[105];
10 string str;
11 bool judge(ll x){ 12 ll v=(a[n]*x+a[n-1])%mod; 13 for(int i=n-2;i>=0;i--) v=(v*x+a[i])%mod; 14 if(v==0) return 1; 15 return 0; 16 } 17 int main(){ 18 scanf("%lld%lld",&n,&m); 19 for(int i=0;i<=n;i++){ 20 cin>>str; 21 int len=str.length(); 22 if
(str[0]=='-') for(int j=1;j<len;j++) a[i]=(a[i]*10+(str[j]-'0'))%mod; 23 else{ 24 for(int j=0;j<len;j++) a[i]=(a[i]*10+(str[j]-'0'))%mod; 25 a[i]=-a[i]; 26 } 27 } 28 for(int i=1;i<=m;i++) if(judge(i)) ans[++cnt]=i; 29 printf("%lld\n",cnt); 30 for(int i=1;i<=cnt;i++) printf("%lld\n",ans[i]); 31 return 0; 32 }
AC程式碼