题目链接:https://cn.vjudge.net/problem/POJ-1060
题意:多项式的运算的题目,不过这个运算有个特点,就是只要是同项的多项式,无论相加还是相减,都为0,给你三个多项式,分别为a,b,c。要你求(a*b)%c。
思路:首先吧a*b算出来,然后,求某个项数乘以c会等于a*b的,然后把a*b的最大的幂降到c以下,求出来的就是答案。
以下为题目中多项式运算所定的规则:
定义两个多项式的加法和减法为当同幂级的项出现两次或不出现时,该幂级前边的系数为0,否则为1;
两个多项式的乘法和普通的多项式乘法一样展开,然后按照加法或减法规则合并;
两个多项式的除法为对这两个多项式相除取余。
题目代码:
第一种方法:
#include <stdio.h>
#include <iostream>
#include <string.h>
#define me(x) memset(x,0,sizeof(x))
int a[2009],b[2009],c[2009],d[2009];
int main()
{
int n,len_a,len_b,len_c,len_d;
scanf("%d",&n);
while(n--)
{
me(a),me(b),me(c),me(d);
scanf("%d",&len_a);
for(int j=--len_a;j>=0;j--) //这里是为了把幂和其位置相等,便于乘法计算。
scanf("%d",&a[j]);
scanf("%d",&len_b);
for(int j=--len_b;j>=0;j--)
scanf("%d",&b[j]);
scanf("%d",&len_c);
for(int j=--len_c;j>=0;j--)
scanf("%d",&c[j]);
for(int i=len_a;i>=0;i--)
for(int j=len_b;j>=0;j--)
{
if(a[i]&&b[j]){ //多项式的乘法,这里还要用上那个他给定你的多项式运算的规则。
if(d[i+j]) d[i+j]=0;
else d[i+j]=1;
}
}
len_d=len_a+len_b; //d是a*b的答案。dde也就是说这个答案的最高次幂是多少。
while(len_d>=len_c) //把d的最高次幂比c小。
{
int tmp;
for(int i=len_c;i>=0;i--)
if(c[i]){
if(d[len_d+i-len_c]) d[len_d+i-len_c]=0;
else d[len_d+i-len_c]=1;
}
for(int i=len_d;i>=0;i--) //找d的最高次幂。
if(d[i]){
len_d=i;
break;
}
}
printf("%d",len_d+1);
for(int i=len_d;i>=0;i--)
printf(" %d",d[i]);
printf("\n");
}
return 0;
}
第二种方法:
#include <iostream>
#include <string.h>
using namespace std;
const int maxn=2010;
int f[maxn],g[maxn],h[maxn],sum[maxn];
int lf,lg,lh,ls;//分别为f,g,h,sum的最高次幂
//比较sum表示的多项式与h表示的多项式的大小
int compare() {
if(ls<lh)
return -1;
if(ls>lh)
return 1;
for(int i=ls-1; i>=0; i--) { //如果最高次幂相等,则从高位向下依次比较
if(sum[i]==h[i])
continue;
if(sum[i]>h[i])
return 1;
if(sum[i]<h[i])
return -1;
}
return 0; //说明俩个多项式完全相同
}
int main() {
int t,d;
scanf("%d",&t);
while(t--) {
memset(h,0,sizeof(h));
memset(sum,0,sizeof(sum));
//将f多项式的信息存入f数组
scanf("%d",&lf);
lf--;
for(int j=lf; j>=0; j--) {
scanf("%d",&f[j]);
}
//将g多项式的信息存入g数组
scanf("%d",&lg);
lg--;
for(int j=lg; j>=0; j--) {
scanf("%d",&g[j]);
}
//将h多项式的信息存入h数组
scanf("%d",&lh);
lh--;
for(int j=lh; j>=0; j--) {
scanf("%d",&h[j]);
}
//计算f*g的多项式
ls=lf+lg;
for(int i=lf; i>=0; i--) {
for(int j=lg; j>=0; j--) {
sum[i+j]=sum[i+j]^(f[i]&g[j]);
}
}
//求余就是多项式相减到小于除数
while(compare()>=0) {
d=ls-lh;
for(int i=ls; i-d>=0; i--) {
sum[i]=sum[i]^h[i-d];
}
while(ls&&(sum[ls]==0))
ls--;
}
printf("%d",ls+1);
for(int i=ls; i>=0; i--) {
printf(" %d",sum[i]);
}
printf("\n");
}
return 0;
}