ACM--多项式类的题目
多项式除法不太一样,和平时的数除法不同。
第一题:poj 1060
题目介绍:给你三个多项式,分别为a,b,c,求(a*b)%c,其中还有一些特定的规则,比较难懂!!!
解题链接:https://blog.csdn.net/xiamusansan/article/details/90175793
1 #include<algorithm> 2 #include<iostream> 3 #include<string> 4 #include<string.h> 5 using namespace std; 6 #define maxn 2005 7 int lena,lenb,lenc,lend; 8 int main() 9 { 10 int a[maxn],b[maxn],c[maxn],d[maxn]; 11 int T; 12 cin>>T; 13 while(T--) 14 { 15 memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));memset(d,0,sizeof(d)); 16 cin>>lena; 17 for(int i=lena-1;i>=0;i--)//因为题目输入是先输入高项 18 cin>>a[i]; 19 cin>>lenb; 20 for(int i=lenb-1;i>=0;i--) 21 cin>>b[i]; 22 cin>>lenc; 23 for(int i=lenc-1;i>=0;i--) 24 cin>>c[i]; 25 for(int i=0;i<lena;i++)//多项式乘法 26 for(int j=0;j<lenb;j++) 27 { 28 if(a[i]&&b[j])//系数都为1才存在该系数 29 { 30 if(d[i+j])//两系数相加,都为1则系数和为0 31 d[i+j]=0; 32 else//前次系数为0,这次系数为1,相加为1 33 d[i+j]=1; 34 } 35 } 36 lend=lena+lenb; 37 lenc--; 38 lend=lend-2; 39 //多项式除法 d%c 40 while(lend>=lenc) //d>c 将多项式除法写成多项式减法,相减直到小于被除数 41 { 42 for(int i=lenc;i>=0;i--)//多项式每项相减 43 { 44 if(c[i]) 45 { 46 if(d[lend-lenc+i])//两系数相减,都为1则系数和为0 47 d[lend-lenc+i]=0; 48 else 49 d[lend-lenc+i]=1; 50 } 51 } 52 //寻找最高幂 53 for(int i=lend;i>=0;i--) 54 { 55 if(d[i]){ 56 lend=i; 57 break; 58 } 59 } 60 } 61 printf("%d",lend+1); 62 for(int i=lend;i>=0;i--) 63 printf(" %d",d[i]); 64 printf("\n"); 65 } 66 }
相关算法:
一. 霍纳法则:https://www.cnblogs.com/qinduanyinghua/articles/5731534.html
解决的问题:对多项式Pn(x)= anxn +an-1xn-1+…+a1x+a0求值
递推的关系Pi(x)= xPi-1(x)+an-i,递推的临界值P0(x)= an,其中i=1…n。
关键代码:
1 for(int i=n-1;i>=0;i--) 2 ans=x*ans+a[i];
问题代码:
1 #include <iostream> 2 using namespace std; 3 int Horner_rule(int arr[],int n,int x) 4 { 5 int i,ans = 0;; 6 for(i =n-1;i>=0;i--) 7 { 8 ans =arr[i]+x*ans; 9 } 10 return ans; 11 } 12 int main() 13 { 14 int n,x,i,t,arr[1000]; 15 cout<<"请输入需要测试的案例数目:" <<endl; 16 cin>>t;//案例数 17 while(t--) 18 { 19 cout<<"输入:n和x : "; 20 cin>>n>>x; 21 cout<<"请输入 "<<n <<" 个系数: "; 22 for(i = 0;i<n;i++)//求值是从 an 开始,所以倒着存 23 cin>>arr[i]; 24 for(i = 0;i<n-1;i++) 25 cout<<arr[i]<<"*x"<<"^"<<i<<"+"; 26 cout<<arr[i]<<"*x"<<"^"<<i<<" = "; 27 cout<<Horner_rule(arr,n,x)<<endl; 28 } 29 return 0; 30 }
二.FFT多项式乘法: https://blog.csdn.net/m0_38013346/article/details/81736390
FFT求卷积:https://www.cnblogs.com/xienaoban/p/6798054.html