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 }
View Code

 

相关算法:

一. 霍纳法则:https://www.cnblogs.com/qinduanyinghua/articles/5731534.html

解决的问题:对多项式Pn(x)= anxn +an-1xn-1+…+ax+a求值

递推的关系Pi(x)= xPi1(x)+ani,递推的临界值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 }
View Code

 二.FFT多项式乘法: https://blog.csdn.net/m0_38013346/article/details/81736390

FFT求卷积:https://www.cnblogs.com/xienaoban/p/6798054.html

 

转载于:https://www.cnblogs.com/Aiahtwo/p/10856249.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值