解题关键:多项式除法的模拟。
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream>//解法有些问题,应该用链表解,因为题目数据是整形范围 #include<cmath> #define maxn 1000006 using namespace std; typedef long long ll; int maxa=-1,maxb=-1; double a[maxn],b[maxn],c[maxn]; int clearzero(double *a,int ma){ int cnt=0; for(int i=ma;i>=0;i--){ if(fabs(a[i])>=0.05) cnt++; } return cnt; } void output(int cnt,double *a,int ma){ if(cnt==0){ printf("0 0 0.0"); }else{ printf("%d",cnt); for(int i=ma;i>=0;i--){ if(fabs(a[i])>=0.05) printf(" %d %.1lf",i,a[i]); } } } int main(){ int n,m,t1; double t2; cin>>n; for(int i=0;i<n;i++){ cin>>t1>>t2; a[t1]=t2; maxa=max(maxa,t1); } cin>>m; for(int i=0;i<m;i++){ cin>>t1>>t2; b[t1]=t2; maxb=max(maxb,t1); } for(int i=maxa;i>=maxb;i--){ c[i-maxb]=a[i]/b[maxb]; for(int j=maxb;j>=0;j--){ a[j+i-maxb]-=c[i-maxb]*b[j]; } } int cnt1,cnt2; cnt1=clearzero(c,maxa-maxb);//商 cnt2=clearzero(a,maxb);//余数 output(cnt1,c,maxa-maxb); printf(" "); output(cnt2,a,maxb); return 0; }