题解
代码
#include <bits/stdc++.h>
using namespace std;
int const N = 100000 + 10;
double const eps = 1e-8;
double const eps2 = 0.05;
int n,e,cnt1,cnt2;
double a[N],b[N],c,ans[N],res[N]; //a[e] = c,表示cx^e,系数可能为浮点数,但是指数一定是整数
void solve(){
for(int i=N-1;i>=0;i--) if(fabs(a[i]) > eps){ //枚举a的每一项
for(int j=N-1;j>=0;j--) if(fabs(b[j]) > eps){
if(i < j) return;
c = a[i] / b[j]; //系数相除
e = i - j; //指数相减
ans[e] = c; //答案的一项
break;
}
for(int j=N-1;j>=0;j--) res[j] = 0;
for(int j=N-1;j>=0;j--) if(fabs(b[j]) > eps){ //多项式B的每一项都乘以cx^e
res[j+e] = c * b[j];
}
for(int j=N-1;j>=0;j--) //两式相减得余数
a[j] = a[j] - res[j];
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) //多项式A
cin>>e>>c, a[e] = c;
scanf("%d",&n);
for(int i=1;i<=n;i++) //多项式B
cin>>e>>c, b[e] = c;
solve();
for(int i=N-1;i>=0;i--){
if(fabs(ans[i]) >= eps2) cnt1++;
if(fabs(a[i]) >= eps2) cnt2++;
}
if(cnt1 == 0) printf("0 0 0.0\n");
else{
printf("%d",cnt1);
for(int i=N-1;i>=0;i--) if(fabs(ans[i]) >= eps2) printf(" %d %.1lf",i,ans[i]);
printf("\n");
}
if(cnt2 == 0) printf("0 0 0.0\n");
else{
printf("%d",cnt2);
for(int i=N-1;i>=0;i--) if(fabs(a[i]) >= eps2) printf(" %d %.1lf",i,a[i]);
}
return 0;
}