一看时限200ms用java可能过不了,但是我试了一下,用数组的话java可以过,用数组比较方便,下标就是指数,该下标的数组存放的是这个式子的系数
import java.io.BufferedInputStream; import java.util.Scanner; public class Main { public static int[] a = new int[2002]; // 存放第一个多项式 public static int[] b = new int[2002]; // 存放第二个多项式 public static int[] c = new int[2002]; // 存放乘法 public static int[] d = new int[2002]; // 存放加法 public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); int n1 = cin.nextInt(); int max1 = 0, max2 = 0; for (int i = 0; i < n1; ++i) { int t1 = cin.nextInt(); int t2 = cin.nextInt(); a[t2] += t1; if (t2 > max1) max1 = t2; // max1记录式子1的最高指数 } int n2 = cin.nextInt(); for (int i = 0; i < n2; ++i) { int t1 = cin.nextInt(); int t2 = cin.nextInt(); b[t2] += t1; if (t2 > max2) max2 = t2; // max2记录式子2的最高指数 } cin.close(); for (int i = 0; i <= max1; ++i) { if (a[i] != 0) { for (int j = 0; j <= max2; ++j) { if (b[j] != 0) { // 下标为指数,存放的是系数 c[i + j] += a[i] * b[j]; // 系数相乘,指数相加 } } } } boolean flag = true; for (int i = max1 + max2; i >= 0; --i) { if (c[i] != 0) { if (flag) { System.out.print(c[i] + " " + i); flag = false; } else { System.out.print(" " + c[i] + " " + i); } } } if (flag) { System.out.print("0 0"); } System.out.println(); for (int i = 0; i <= max1; ++i) { if (a[i] != 0) { d[i] += a[i]; // 把式子1收进数组d } } for (int i = 0; i <= max2; ++i) { if (b[i] != 0) { d[i] += b[i]; // 指数相同系数相加 } } // out int m = max1 > max2 ? max1 : max2; // 只需要知道最高次方即可 boolean f = true; for (int i = m; i >= 0; --i) { if (d[i] != 0) { if (i == m) { System.out.print(d[i] + " " + i); f = false; } else { System.out.print(" " + d[i] + " " + i); } } } if (f) { System.out.println("0 0"); } else { System.out.println(); } } }
========================================Talk is cheap, show me the code=======================================