天梯赛 L2-018 多项式A除以B
题目
这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。
输入格式:
输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:
N e[1] c[1] ... e[N] c[N]
其中N是该多项式非零项的个数,e[i]是第i个非零项的指数,c[i]是第i个非零项的系数。各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系数是非零整数,所有整数在整型范围内。
输出格式:
分两行先后输出商和余,输出格式与输入格式相同,输出的系数保留小数点后1位。同行数字间以1个空格分隔,行首尾不得有多余空格。注意:零多项式是一个特殊多项式,对应输出为0 0 0.0。但非零多项式不能输出零系数(包括舍入后为0.0)的项。在样例中,余多项式其实有常数项-1/27,但因其舍入后为0.0,故不输出。
输入样例
4 4 1 2 -3 1 -1 0 -1
3 2 3 1 -2 0 1
输出样例
3 2 0.3 1 0.2 0 -1.0
1 1 -3.1
题解
前提:掌握多项式除法的数学知识.
数据结构:使用map<int, double>来存储多项式,键为阶数,值为系数.
使用递归来模拟多项式除法,直到被除数阶数小于除数阶数.
在得到结果(商和余数)之后,对其中舍入后为0.0的部分进行删除(注:由于在删除过程中改变容器容量,迭代器的使用要小心).
注意极端情况,为0多项式.
个人代码
#include <bits/stdc++.h>
using namespace std;
map<int, double, greater<>> shang;
map<int, double, greater<int>> yu;
map<int, double, greater<int>> beichu;
map<int, double, greater<int>> chushu;
void get_res(map<int, double, greater<int>> bei, \
map<int, double, greater<int>> chu) {
if (bei.empty() || chu.empty()) return;
int bei_jie = (*bei.begin()).first;
double bei_xi = (*bei.begin()).second;
int chu_jie = (*chu.begin()).first;
double chu_xi = (*chu.begin()).second;
if (bei_jie<chu_jie) {
yu = bei;
return;
}
double mul = bei_xi/chu_xi;
int def_jie = bei_jie-chu_jie;
shang.insert({def_jie, mul});
for (auto [jie, xi]: chu) {
double new_xi = mul*xi;
int new_jie = jie+def_jie;
bei[new_jie] -= new_xi;
if(bei[new_jie]==0) {
bei.erase(bei.find(new_jie));
}
}
get_res(bei, chu);
}
int main() {
int N;
cin>>N;
for (int i = 0; i<N; i++) {
int a, b;
cin>>a>>b;
beichu.insert({a, b});
}
cin>>N;
for (int i = 0; i<N; i++) {
int a, b;
cin>>a>>b;
chushu.insert({a, b});
}
get_res(beichu, chushu);
for (auto it = shang.begin(); it!=shang.end();) {
if (fabs(it->second)<0.05) {
it=shang.erase(it);
}
else it++;
}
if (shang.size()==0) {
printf("0 0 0.0\n");
}
else {
cout << shang.size();
for (auto &a: shang) {
printf(" %d %.1lf", a.first, a.second);
}
cout << endl;
}
for (auto it = yu.begin(); it!=yu.end();) {
if (fabs(it->second)<0.05) {
it = yu.erase(it);
}
else it++;
}
if (yu.size()==0) {
printf("0 0 0.0\n");
}
else {
cout << yu.size();
for (auto &a: yu) {
printf(" %d %.1lf", a.first, a.second);
}
cout << endl;
}
}

浙公网安备 33010602011771号