考虑到n元多项式乘法太BT了,改成加法,毕竟只有对应元指数完全相同的项才会相加嘛……
对于n元多项式的表示,会给出一个k*(n+1)的矩阵表示
其中k表示有多少项,每个式子不超过1000项;
2~n列表示对应的元在该项的指数,第一列表示对应项的系数;
例如式子A有2项,是个3元多项式,那么给出矩阵就是5*4的矩阵
1 1 1 1
2 2 1 2
不妨假设3元为x,y,z,那么上诉矩阵对应式子A数学表达式为:
1*x^1*y^1*z^1 + 2*x^2*y^1*z^2
给出两个式子F,G,请输出F+G的答案,输出格式和输入类似,要求按照从第2~n列的顺序的升序,例如当N=2时,输出顺序应该这样:
1 0 1
2 1 0
对于给定的式子A,保证每一项中至少有一个元的指数非零。
对于输出结果如果某一项的系数为0,则不输出该项。
- 输入
-
输入第一行包含一个整数T,表示有T组测试数据;
对于每组测试数据:
第一行包含3个数据n,k1,k2,分别表示n元,第一个式子的项数k1,第二个式子的项数k2;
接下来的两个矩阵k1*(n+1)与k2*(n+1)则由题目描述;
保证n元不多于100元;
- 输出
-
输出格式按照题目描述要求输出;
找到对应关系即可
#include <stdio.h> #include <string.h> main() { int i,j,t,number,n,k1,k2,xi[3001]; char a[3001][500]; int flag=1; int temp; char b[500]; int num; scanf("%d",&number); for( t=0;t<number;t++) { scanf("%d %d %d",&n,&k1,&k2); for(i=0;i<k1;i++) { scanf("%d",&xi[i]); gets(a[i]); } num=k1; for(i=0;i<k2;i++) { flag=1; scanf("%d",&temp); gets(b); for( j=0;j<num;j++) { if(strcmp(a[j],b)==0) { xi[j]+=temp; flag=0; break; } } if(j==num&&flag!=0) { strcpy(a[j],b); xi[j]=temp; num++; } } for(i=0;i<num;i++) for(j=i;j<num;j++) { if(strcmp(a[i],a[j])>0) { strcpy(b,a[j]); strcpy(a[j],a[i]); strcpy(a[i],b); temp=xi[j]; xi[j]=xi[i]; xi[i]=temp; } } for(i=0;i<num;i++) { if(xi[i]!=0) printf("%d%s\n",xi[i],a[i]); } } return 0; }