# Polynomial# Expansion# Array

d437 - 10326 - The Polynomial Equation

🔗 前往 ZeroJudge 原題

題目描述

題目要求根據給定的根,生成對應的多項式並輸出。多項式的形式為 x^n + ... + c0 = 0,其中 n 是根的個數。輸出時需要注意以下幾點:

  1. 係數為 0 的項不輸出。
  2. 係數為 1 的項不輸出係數。
  3. 常數項為 0 時,輸出 +0
  4. 使用 x^i 表示 xi 次方。

解題思路

這題的核心思想是利用多項式的根與係數之間的關係。給定 n 個根 r1, r2, ..., rn,則多項式可以表示為 (x - r1)(x - r2)...(x - rn)。程式碼通過迭代的方式,逐步將每個根納入多項式中。

  1. 初始化一個係數陣列 ans,表示多項式 x^0 = 1
  2. 遍歷每個根 a[i]
  3. 對於每個根,將當前多項式 ans(x - a[i]) 相乘。這相當於將 ans 中的每一項乘以 x,然後加上 ans 中的每一項乘以 -a[i]
  4. 將新的多項式儲存在 nxt 陣列中,然後更新 ans 陣列。
  5. 最後,遍歷 ans 陣列,按照要求輸出多項式。

複雜度分析

  • 時間複雜度: O(n^2),其中 n 是根的個數。因為有兩層迴圈,分別用於遍歷根和多項式的係數。
  • 空間複雜度: O(n),因為需要一個大小為 n+1 的陣列 ansnxt 來儲存多項式的係數。

程式碼

#include <iostream>
using namespace std;
long long n,a[51];
int main(){
	while(cin >> n){
		long long ans[51]={1};
		for(int i=0;i<n;++i)
			cin >> a[i];
		for(int i=0;i<n;++i){
			long long nxt[51]={0};
			for(int j=0;j<n;++j){
				nxt[j+1]=ans[j];
				nxt[j]+=ans[j]*a[i];
			}
			for(int j=0;j<=n;++j)
				ans[j]=nxt[j];
		}
		for(int i=n,j=0;i>=0;--i,++j){
			if(ans[i]==0&&i)continue;
			if(i!=n){
				bool j1=0;
				if(ans[i]<0){
					j1=1;
					ans[i]*=-1;
				}
				if((j+j1)%2){
					if(ans[i]==0)cout << "+ ";
					else cout << "- ";
				}
				else
					cout << "+ ";
			}
			if((ans[i]!=1&&ans[i])||i==0)cout << ans[i];
			if(i>1)
				cout << "x^" << i << " ";
			else if(i==1)
				cout << "x ";
			else
				cout << " ";
		}
		cout << "= 0\n";
	}
}

Discussion