| 时间限制 | 空间限制 | 
|---|---|
1000 ms | 
65536 KB | 
# 题目描述
给定整数序列 和 ,严格递增的非负整数序列 和 ,求解如下多项式:
# 输入格式
第一行一个正整数 (),表示数据组数。
对于每组数据,第一行一个正整数 (),含义同题目描述。
第二行 个整数 (),含义同题目描述。
第三行 个非负整数 (),含义同题目描述。
第四行一个正整数 (),含义同题目描述。
第五行 个整数 (),含义同题目描述。
第六行 个非负整数 (),含义同题目描述。
保证 对 成立, 对 成立, 对 成立。
# 输出格式
对于每组数据,输出三行:
第一行一个正整数 ,表示所得多项式在合并同类项后有 个系数非 项,并设所得多项式为:
其中 对 成立。
第二行 个整数 ,含义同上式。
第三行 个非负整数 ,含义同上式。
# 输入样例
1  | |
3  | |
1 2 3  | |
1 2 3  | |
3  | |
2 3 4  | |
2 3 4  | 
# 输出样例
4  | |
1 4 6 4  | |
1 2 3 4  | 
# 题解:模拟
写一个仿照归并排序的模拟,就可以很容易地合并同类项。具体参考代码:
#include <stdio.h> | |
int n, m, cnt, a[100010], A[100010], b[100010], B[100010], c[200010], C[200010];  | |
int main()  | |
{ | |
    // freopen("G.in", "r", stdin); | |
    // freopen("G.out", "w", stdout); | |
int T;  | |
scanf("%d", &T);  | |
while (T -- )  | |
    { | |
cnt = 0;  | |
scanf("%d", &n);  | |
for (int i = 1; i <= n; ++ i)  | |
scanf("%d", &a[i]);  | |
for (int i = 1; i <= n; ++ i)  | |
scanf("%d", &A[i]);  | |
scanf("%d", &m);  | |
for (int i = 1; i <= m; ++ i)  | |
scanf("%d", &b[i]);  | |
for (int i = 1; i <= m; ++ i)  | |
scanf("%d", &B[i]);  | |
int i = 1, j = 1;  | |
while (i <= n && j <= m)  | |
        { | |
if (A[i] < B[j])  | |
            { | |
c[ ++ cnt] = a[i];  | |
C[cnt] = A[i];  | |
++ i;  | |
            } | |
else if (A[i] == B[j])  | |
            { | |
if (a[i] + b[j] != 0)  | |
                { | |
c[ ++ cnt] = a[i] + b[j];  | |
C[cnt] = A[i];  | |
                } | |
++ i, ++ j;  | |
            } | |
            else | |
            { | |
c[ ++ cnt] = b[j];  | |
C[cnt] = B[j];  | |
++ j;  | |
            } | |
        } | |
while (i <= n)  | |
        { | |
c[ ++ cnt] = a[i];  | |
C[cnt] = A[i];  | |
++ i;  | |
        } | |
while (j <= m)  | |
        { | |
c[ ++ cnt] = b[j];  | |
C[cnt] = B[j];  | |
++ j;  | |
        } | |
printf("%d\n", cnt);  | |
for (int i = 1; i <= cnt; ++ i)  | |
printf("%d ", c[i]);  | |
puts("");  | |
for (int i = 1; i <= cnt; ++ i)  | |
printf("%d ", C[i]);  | |
puts("");  | |
    } | |
return 0;  | |
} |