L2-018 多项式A除以B
Statement
Metadata
- 作者: 陈越
- 单位: 浙江大学
- 代码长度限制: 16 KB
- 时间限制: 400 ms
- 内存限制: 64 MB
这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。
输入格式
输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:
其中N
是该多项式非零项的个数,e[i]
是第i
个非零项的指数,c[i]
是第i
个非零项的系数。各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系数是非零整数,所有整数在整型范围内。
输出格式
分两行先后输出商和余,输出格式与输入格式相同,输出的系数保留小数点后1位。同行数字间以1个空格分隔,行首尾不得有多余空格。注意:零多项式是一个特殊多项式,对应输出为0 0 0.0
。但非零多项式不能输出零系数(包括舍入后为0.0)的项。在样例中,余多项式其实有常数项-1/27
,但因其舍入后为0.0,故不输出。
输入样例
输出样例
Solution
#include <bits/stdc++.h>
using namespace std;
#define db double
#define ll long long
#define INF 0x3f3f3f3f
#define N 100010
#define pid pair<int, db>
#define fi first
#define se second
const db eps = 0.05;
int n, m;
db A[N], B[N];
db Q[N];
void out(db *a) {
vector<pid> vec;
for (int i = 3000; i >= 0; --i)
if (abs(a[i] - 0) > eps)
vec.push_back(pid(i, a[i]));
if (vec.empty())
puts("0 0 0.0");
else {
int len = vec.size();
printf("%d", len);
for (int i = 0; i < len; ++i) printf(" %d %.1f", vec[i].fi, vec[i].se);
puts("");
}
}
int main() {
// ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
scanf("%d", &n);
int a = 0, b = 0;
for (int i = 1, e, c; i <= n; ++i) {
scanf("%d%d", &e, &c);
A[e] = c;
a = max(a, e);
}
scanf("%d", &m);
for (int i = 1, e, c; i <= m; ++i) {
scanf("%d%d", &e, &c);
B[e] = c;
b = max(b, e);
}
if (a < b) {
puts("0 0 0.0");
printf("%d", n);
for (int i = 3000; i >= 0; --i)
if (abs(A[i] - 0) > eps)
printf(" %d %.1f", i, A[i]);
puts("");
} else {
for (int i = 3000; i >= 0; --i) {
int j, k;
for (j = 3000; j >= 0; --j)
if (abs(A[j] - 0) > eps)
break;
for (k = 3000; k >= 0; --k)
if (abs(B[k] - 0) > eps)
break;
if (k > j)
break;
Q[j - k] = A[j] * 1.0 / B[k];
for (int o = 0; o <= 3000; ++o)
if (abs(B[o] - 0) > eps)
A[j - k + o] -= A[j] * 1.0 * B[o] / B[k];
}
out(Q);
out(A);
}
return 0;
}
Last update: May 4, 2022