描述
考虑到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;
}